链接列表程序显示学生标记

链接列表程序显示学生标记

问题描述:

#include<stdio.h> 

#include<conio.h> 

#include<stdlib.h> 

void Insert(); 
void DisplayList(); 
struct Student 
{ 
char Name[10]; 
int Marks; 
struct Student *Next; 
} *Start; 
int main() 
{ 
Start = NULL; 
int Choise; 
while (1) 
{ 
printf("enter number to choose "); 
scanf_s("%d", &Choise); 
switch (Choise) 
{ 
case 1: 
    Insert(); 
    break; 
    case 3: 
     DisplayList(); 
     break; 
    default: 
    printf("Incorrect assignment Press relevant key :"); 
    } 
    } 
    } 
    void Insert() 
    { 
    struct Student *Temp, *current=NULL; 
    Temp = (struct Student *) malloc(sizeof(struct Student)); 
    printf("Enter Name Of Student"); 
    scanf_s("%s",&Temp->Name); 
    printf("Enter Marks Of Student"); 
    scanf_s("%d", &Temp->Marks); 
    Temp->Next = NULL; 
    if (Start == NULL) 
    { 
     Start = Temp; 
     Temp->Next = NULL; 
    } 
    else 
     current = Start; 
     while (current->Next != NULL) 
     { 
     current = current->Next; 
     current->Next = Temp; 
     } 
    } 
    void DisplayList() 
    { 
    struct Student *current, *Temp; 
    current = Start->Next; 
    if (Start == NULL) 
    { 
     printf("No Element in the list"); 
    } 
    else 
    { 
     for (current = Start; current != NULL; current = current->Next) 
     { 
      printf("The List are\n"); 
      printf_s("%d",current->Marks); 
     } 

    } 

这是一个为单链表编写的程序。当我显示列表时,它只给出列表中的一个元素。每当我试图打印链表的元素,它只给出一个元素输出 我做了什么错误请帮忙?链接列表程序显示学生标记

+1

尝试使用调试器。正确格式化你的代码也可能有帮助。 – 2014-11-22 21:59:15

变化

else 
    current = Start; 
    while (current->Next != NULL) 
    { 
    current = current->Next; 
    current->Next = Temp; 
    } 

else { 
    current = Start; 
    while (current->Next != NULL) 
    { 
     current = current->Next; 
    } 
    current->Next = Temp; 
} 

scanf_s("%s", Temp->Name, sizeof(Temp->Name)); //remove & and add size(see Amnon's answer) 
+0

感谢您解决这个问题 – 2014-11-22 23:31:48

当使用scanf_s这是scanf函数的安全版本,将有望通过不仅是地址缓冲区,但其大小作为下一个参数,即:

scanf_s("%s", Temp->Name, _countof(Temp->Name)); 

您可以阅读http://msdn.microsoft.com/en-us/library/w40768et.aspx

更多关于它的代码的另一个问题是,你初始化currentNULL但随后试图访问其Next场。

更改代码在这里:

else 
    current = Start; 
    while (current->Next != NULL) 
    { 
    current = current->Next; 
    current->Next = Temp; 
    } 

这样:

else { 
    current = Start; 
     while (current->Next != NULL) 
     { 
     current = current->Next; 
     } 
     current->Next = Temp; 
     temp->next=NULL; 
    } 

你忘记在接下来的指针加空,因此你只得到一个输出。