2014-11-22 3 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

디버거를 사용해보십시오. 코드를 올바르게 포맷하는 것도 도움이 될 수 있습니다. –

답변

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

이 문제를 해결해 주셔서 감사합니다. –

1

scanf와의 안전한 버전입니다 scanf_s를 사용하여, 당신은의뿐만 아니라 주소를 전달할 것으로 예상된다 버퍼뿐만 아니라 그 크기를 다음 매개 변수로 사용합니다.

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

당신은 코드와 다른 문제 http://msdn.microsoft.com/en-us/library/w40768et.aspx

에 대한 자세한 내용을보실 수 있습니다 당신이 NULLcurrent을 초기화하지만 그 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; 
    } 

당신이 다음 포인터에 NULL을 추가하는 것을 잊지 따라서 당신은 단지 하나의 출력을 얻고있다.