C 将节点添加到链接列表

C 将节点添加到链接列表,c,linked-list,C,Linked List,所以我在C中创建了一个链表,并向其中添加了一些包含信息的节点。我有一个if-else语句,在其中创建链表的头部,然后向其添加节点。问题是,当我添加一个新节点时,我似乎丢失了旧节点。不知道为什么会发生这种情况,也不知道如何解决 编辑:我做了一些更新,使它成为一个可运行的程序 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdint.h> #include<re

所以我在C中创建了一个链表,并向其中添加了一些包含信息的节点。我有一个if-else语句,在其中创建链表的头部,然后向其添加节点。问题是,当我添加一个新节点时,我似乎丢失了旧节点。不知道为什么会发生这种情况,也不知道如何解决

编辑:我做了一些更新,使它成为一个可运行的程序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdint.h>
#include<regex.h>

int main(int argc, char argv[]) {


int head=0, i=0;
char tempCourseID[10], tempCourseGrade[10], tempCourseCH[10];
static struct LinkedList {
char *CourseName;
char *CourseGrade;
char *CourseCreditHours;
struct LinkedList *next;
} LinkedList;

static struct LinkedList *first, *savefirst, *headlist;

first = malloc(sizeof ((*first)));

savefirst = first;
headlist = first;
for(i ; i<5; i++){
printf("Enter Course name");
fgets(tempCourseID, sizeof(tempCourseID), stdin);

printf("Enter Course grade");
fgets(tempCourseGrade, sizeof(tempCourseGrade), stdin);

printf("Enter Course credit hours");
fgets(tempCourseCH, sizeof(tempCourseCH), stdin);
//checks to see if linked list head exists
   if (head == 0) { 
   printf("No head has been found.\n");

   headlist->CourseName = tempCourseID;
   headlist->CourseGrade = tempCourseGrade;
   headlist->CourseCreditHours = tempCourseCH;
   headlist->next = NULL;


   printf("A head has been created\n");
   printf("A node has been added\n");
   head = 1;       
   } else {
   printf("Ahead already exists\n");


   first = malloc(sizeof ((*first)));
   first->CourseName = tempCourseID;
   first->CourseGrade = tempCourseGrade;
   first->CourseCreditHours = tempCourseCH;

   first->next = NULL;
   savefirst->next = first;
   savefirst = first;

   printf("A node has been add\n");
   head = 1;

   }

}

while (headlist != NULL) {
    printf(" %s ", headlist->CourseName);
    printf(" %s ", headlist->CourseGrade);
    printf("%s \n", headlist->CourseCreditHours);
    headlist = headlist->next;
}

return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char argv[]{
int head=0,i=0;
char tempCourseID[10]、tempCourseGrade[10]、tempCourseCH[10];
静态结构链接列表{
char*CourseName;
char*CourseGrade;
char*CourseCreditHours;
结构链接列表*下一步;
}链接列表;
静态结构LinkedList*first、*savefirst、*headlist;
第一个=malloc(sizeof((*first));
savefirst=first;
标题列表=第一;
对于(i;iCourseName=tempCourseID;
headlist->CourseGrade=临时CourseGrade;
标题列表->课程编辑小时数=临时课程技术;
标题列表->下一步=空;
printf(“已创建头\n”);
printf(“已添加节点\n”);
水头=1;
}否则{
printf(“前面已经存在\n”);
第一个=malloc(sizeof((*first));
第一->CourseName=tempCourseID;
第一->课程等级=临时课程等级;
first->CourseCreditHours=tempCourseCH;
first->next=NULL;
savefirst->next=first;
savefirst=first;
printf(“已添加节点”);
水头=1;
}
}
while(headlist!=NULL){
printf(“%s”,标题列表->CourseName);
printf(“%s”,标题列表->课程等级);
printf(“%s\n”,标题列表->课程编辑时间);
标题列表=标题列表->下一步;
}
返回0;
}

您有char
tempCourseID[10]
char*CourseName

使用
CourseName=tempCourseID;
是合法的,但是
tempCourseID
是临时的,因此字符串很快就会丢失。在这种情况下,我们需要为
CourseName
分配单独的内存,然后从
tempCourseID
复制值

改用

CourseName = malloc(strlen(tempCourseID) + 1);//add +1 for null-character
strcpy(CourseName, tempCourseID);

//or

CourseName = strdup(tempCourseID)//shortcut!
链表有问题。名称相似的变量太多。链表只需要
标题
。您可以引入一个临时变量
节点
,用于添加新节点。如果要将节点添加到尾部,则保存列表中的最后一个节点,称之为
保存节点

在本例中,我删除了
fgets
函数,并将其替换为
sprintf
,这只是为了更方便地运行程序和调试。您可以稍后再放回
fgets

int main(int argc, char argv[]) 
{
    struct LinkedList
    {
        char *CourseName;
        char *CourseGrade;
        char *CourseCreditHours;
        struct LinkedList *next;
    };

    int i;
    char tempCourseName[100], tempCourseGrade[100], tempCourseCH[100];
    struct LinkedList *head = NULL;
    struct LinkedList *node = NULL;
    struct LinkedList *savenode = NULL;

    for(i = 0; i < 5; i++)
    {
        sprintf(tempCourseName, "CourseName %d", i);
        sprintf(tempCourseGrade, "tempCourseGrade %d", i);
        sprintf(tempCourseCH, "tempCourseCH %d", i);

        node = malloc(sizeof(*node));
        node->CourseName = strdup(tempCourseName);
        node->CourseGrade = strdup(tempCourseGrade);
        node->CourseCreditHours = strdup(tempCourseCH);
        node->next = NULL;

        if(head == NULL)
            head = node;

        //check savenode exists
        //this will be the last node (tail) in the existing list
        //get it to point to our new node
        if(savenode)
            savenode->next = node;

        //now we have a new tail
        savenode = node;
    }

    //walk through the list
    node = head;
    while(node) 
    {
        printf("%s, %s, %s\n", 
            node->CourseName, node->CourseGrade, node->CourseCreditHours);
        node = node->next;
    }

    return 0;
}
int main(int argc,char argv[])
{
结构链接列表
{
char*CourseName;
char*CourseGrade;
char*CourseCreditHours;
结构链接列表*下一步;
};
int i;
char tempCourseName[100]、tempCourseGrade[100]、tempCourseCH[100];
结构LinkedList*head=NULL;
结构LinkedList*节点=NULL;
结构LinkedList*savenode=NULL;
对于(i=0;i<5;i++)
{
sprintf(临时课程名称,“课程名称%d”,i);
sprintf(tempCourseGrade,“tempCourseGrade%d”,i);
sprintf(tempCourseCH,“tempCourseCH%d”,i);
node=malloc(sizeof(*node));
节点->CourseName=strdup(tempCourseName);
节点->课程升级=标准升级(临时课程升级);
节点->课程编辑小时数=标准时间(tempCourseCH);
节点->下一步=空;
if(head==NULL)
头部=节点;
//检查保存节点是否存在
//这将是现有列表中的最后一个节点(尾部)
//让它指向我们的新节点
如果(保存节点)
savenode->next=节点;
//现在我们有了一条新尾巴
savenode=node;
}
//浏览列表
节点=头部;
while(节点)
{
printf(“%s,%s,%s\n”,
节点->课程名称,节点->课程等级,节点->课程编辑小时数);
节点=节点->下一步;
}
返回0;
}

要真正调试它,我们需要查看实际代码的样子,以及事件的正确顺序。这将每次生成一个节点,并将其打印出来。
headlist->CourseName=tempCourseID;
和类似的功能可能与您认为的功能不同。这不是将字符串数据复制到这些字段,而是简单地分配一个poi在内存中只有一个
tempCourseID
,所以对于您创建的每个节点,它们都将指向
tempCourseID
,如果您将它们全部打印出来,它们将打印最后在
tempCourseID
中输入的任何内容。您可能需要分配一些空间对于
struct
中的每个
char*
字段,然后将其覆盖。