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