首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C链接列表添加新节点问题

C链接列表添加新节点问题
EN

Stack Overflow用户
提问于 2016-12-04 14:33:14
回答 1查看 158关注 0票数 0

最终的完整程序在下面的链接下面。谢谢每一个回复我的人。

已完成程序:http://pastebin.com/1Qrs11JE

问题:

我有一个恼人的问题,链接列表在C语言。我明天要提交一份作业。我从昨天开始就一直试图解决这个问题,但是我做不到。我认为问题是在链接列表中添加新的节点,但是当我试图查看链接列表中的记录时,我会得到错误。我面对的是有意义的结果,而这个程序最终导致一个错误。

您可以在下面的链接中看到更易读的代码或从下面看到的代码。链接:http://pastebin.com/Ugtue6JT

这是我的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>

// structure definition
 struct node {
char name[50];
int age;
int student_no;
char nationality[50];
struct node *next;
};
typedef struct node *NODE_T;

// function declarations
void enter_new_data();
void remove_existing_data();
void display_all_data();
void show_options();
NODE_T getnode();
void freenode(NODE_T p);
void free_buffer();
void continue_f(char message[100]);

// global variables
char ch;

// create linked-list's main holder variable
NODE_T students,conductor;

int main(){

// allocate memory for the node link-list holder
students = NULL;
//students->next = 0; // initialize next to 0 for first node of linked-list

// show the options that user has
show_options();

return 1;
}

// this function will list options that user can apply
void show_options(){

system("cls"); // clear screen

int opt,opt_bool=0;

printf("%s\n\n%s\n%s\n%s\n%s\n\n","The Options You Have","1. Add New Student's Record","2. Delete An Existing Student's Record","3. Display The List Of Students","4. Exit");


while(opt_bool != 1){
    printf("Operation:  ");
    scanf("%d",&opt);

    if(opt == 1 || opt == 2 || opt == 3 || opt == 4){
        opt_bool = 1;
    }

}

// check the operation and go to the operation
if(opt == 1){ // adding record
    enter_new_data();
} else if(opt == 2){ // removing record

} else if(opt == 3){ // displaying records
    display_all_data();
} else if(opt == 4){ // exit the program
    exit(0);
}
}

// enter new student data into linked-list
void enter_new_data(){

system("cls"); // clear screen

// get a new node
NODE_T p = getnode();

printf("You are entering a new student's record\n");

// take student's name
printf("Student's Name: ");
scanf("%s",p->name);
free_buffer();

// take student's age
printf("Student's Age: ");
scanf("%d",&p->age);
free_buffer();

// take student's number
printf("Student's Number: ");
scanf("%d",&p->student_no);
free_buffer();

// take student's nationality
printf("Student's Nationality: ");
scanf("%s",p->nationality);
free_buffer();

// set p->next next value of last node of linked-list, which is equal to 0
p->next = 0;

printf("%s, %d, %d, %s",p->name,p->age,p->student_no,p->nationality);


// if there is no any node yet, add node p as first node
if(students == NULL) {
    students = p;
} else {

    conductor = students; // assign linked-list to the conductor to traverse

    // reach the last node
    while (conductor->next != 0)
    {
        conductor = conductor->next;
    }

    conductor->next = p; // append the node p to the linked list
}

freenode(p); // set free node p

continue_f("Adding new record is done."); // ask press any key to continue

show_options(); // show options

}

// to display all data of linked list
void display_all_data(){

system("cls"); // clear screen

printf("The Student Records\n\n");

printf("%s%7s%18s%15s","STUDENT'S NAME","AGE","STUDENT NUMBER","NATIONALITY"); // captions

freenode(conductor);
conductor = getnode();
conductor = students; // assign linked-list to the conductor to traverse

if (conductor != NULL ) { /* Makes sure there is a place to start */
    // traverse untill last node
    while ( conductor->next != 0)
    {

        printf("\n%s%7d%18d%15s",conductor->name,conductor->age,conductor->student_no,conductor->nationality); // record

        conductor = conductor->next;
    }
  } else {
    printf("\n\n There is not any record yet.");
  }

  continue_f("Listing records is done."); // ask press any key to continue

  show_options(); // show options
}

// create new node
NODE_T getnode(void){
   NODE_T p;
   p = (struct node *) malloc(sizeof(struct node));
   return p;
}

// set free a node
void freenode(NODE_T p){
    free(p);
}

// clear the buffer if there are any extra data in it
void free_buffer(){
    while (getchar() != '\n') { }   
}

void continue_f(char message[100]){
     printf("\n\n%s\nPress any key to continue...",message);
     getch(); // wait for pushing any key from user
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-04 18:28:54

在查找和检查所提供的源代码后,由于对链接列表中节点的malloc()/free()的误解,存在多个问题。

  1. 若要将节点添加到链接列表中,应先对其进行分配和初始化,
  2. 当使用指向已分配节点的指针时,既不分配也不释放该指针,
  3. 添加到链接列表中的节点只能在删除或删除链接列表后才能释放。

按照这些规则,以下是检测到的错误:

错误1:在enter_new_data()中,一个意外的freenode(p);

节点p已被链接..。别解放它。

代码语言:javascript
复制
// if there is no any node yet, add node p as first node
if(students == NULL) {
    students = p;
}
else {
    conductor = students; // assign linked-list to the conductor to traverse
    // reach the last node
    while (conductor->next != NULL)
    {
        conductor = conductor->next;
    }
    conductor->next = p; // append the node p to the linked list
}
// NO !!!!
freenode(p); // set free node p

Error 2:在display_all_data()中,conductor的意外空闲/malloc。

变量conductor只是一个临时指针,用于浏览链接列表(未分配)。

代码语言:javascript
复制
// NO !!!!
freenode(conductor);
// NO !!!!
conductor = getnode();

conductor = students; // assign linked-list to the conductor to traverse

if (conductor != NULL ) { /* Makes sure there is a place to start */

错误3display_all_data()中的小错误,要探索链接列表中的所有项,请使用节点指针而不是下一个指针。

通过( conductor != NULL)的测试也探讨了最后一项。

代码语言:javascript
复制
    while ( conductor != NULL) //->next != 0)
    {
        printf("\n%s%7d%18d%15s",conductor->name,conductor->age,
            conductor->student_no,conductor->nationality); // record
        conductor = conductor->next;
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40959687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档