我正在尝试创建学生及其ID的链接列表。 我认为一切都很好,除了函数中的List *头。 我对功能并不擅长,所以我不知道它是否正确。
当我尝试打印所有学生时,它没有给出任何输出它只返回到指令(再次通过主循环而不打印名称)。 你能帮我吗?
对我来说,看起来每个功能和主要部分的头部都不相同,所以打印不会发生,但我无法弄清楚如何解决这个问题。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct node
{
char name[50];
int ID;
node *next;
}
List;
void Linked_insert(char givenname[50], int givenID, int start, List* head)
{
//if its the users first time inserting start becomes 0 and if it isnt start is 1 so for both cases i made that condition
if(start==0){
strcpy(head->name, givenname);
head->ID = givenID;
head->next = NULL;
return head;
}
if(start==1){
//end of list
List* current = head;
while(current->next != NULL){
current = current->next;
}
current->next = malloc(sizeof(List));
strcpy(current->next->name, givenname);
current->next->ID = givenID;
current->next->next = NULL;
return current->next;
}
}
void Linked_destroy()
{
}
void Print_student(List* head)
{
}
void Print_all(List* head)
{
List* current = head;
while(current->next != NULL){
printf("Student ID [%d] has name [%s]\n", current->ID, current->name);
current = current->next;
}
}
int main()
{
int loop=0, start=0;
while(loop != 1)
{
printf("\n\n\n\n");
printf("Data Structures - Linked List and Binary Tree\n");
printf("Choose one Option:\n\n");
printf("1.Insert Student\n");
printf("2.Remove Student\n");
printf("3.Print 1 student\n");
printf("4.Print all student\n");
printf("5.Exit\n\n");
int option=0, inputID;
char inputname[50];
List* head = malloc(sizeof(List));
scanf("%d", &option);
switch(option)
{
case 1:
printf("Enter Student name: ");
scanf("%s", inputname);
printf("Enter Student ID: ");
scanf("%d", &inputID);
Linked_insert(inputname, inputID, start, head);
start = 1;
break;
case 2:
break;
case 3:
break;
case 4:
Print_all(head);
break;
case 5:
loop =1;
break;
default:
loop =1;
break;
}//end of switch
}//end of infinte loop
}//end of main
答案 0 :(得分:0)
问题出现了,因为您在head
循环的每次迭代中将内存分配给列表的while
:
while(loop != 1)
.....
.....
List* head = malloc(sizeof(List));
在while循环的每次迭代中,新的head
列表都会被创建,而旧的head
引用会丢失(内存泄漏)。
在进入while循环之前移动head
节点内存分配。
另一个问题是函数Print_all()
,它不会打印列表的最后一个节点:
while(current->next != NULL){
这应该是
while(current != NULL){
您的代码中存在更多问题,例如Linked_insert()
返回类型为void
,但它返回了一些值。编译器必须对这些return
语句给出错误。
此外,您没有释放动态分配给列表节点的内存。遵循良好的编程习惯,一旦完成列表,就应该释放列表中的所有节点。