打印链接列表,不打印任何内容

时间:2018-06-12 10:43:00

标签: c linked-list

我正在尝试创建学生及其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

1 个答案:

答案 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语句给出错误。

此外,您没有释放动态分配给列表节点的内存。遵循良好的编程习惯,一旦完成列表,就应该释放列表中的所有节点。