2014-11-22 58 views
1
#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

回答

1

變化

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

1

當使用scanf_s這是scanf函數的安全版本,將有望通過不僅是地址緩衝區,但其大小作爲下一個參數,即:

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

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

更多關於它的代碼的另一個問題是,你初始化currentNULL但隨後試圖訪問其Next場。

0

更改代碼在這裏:

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; 
    } 

你忘記在接下來的指針加空,因此你只得到一個輸出。