2010-09-02 4 views
1

Я сделал следующий связанный список, который не распечатывает список. Функция printrecord не работает. Обратите внимание на длинный код.Связанный список не распечатывает список

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<string.h> 
struct student 
    { 
    char *name; 
    int roll_no; 
    struct student *ptr_next; 
    }*ptr_this,*ptr_first; 
void PrintMenu(void); 
void AddRecord(void); 
void DeleteRecord(void); 
void SearchRecord(void); 
void SortRecord(void); 
void PrintRecord(void); 
int main() 
{ 
    char choice; 
    ptr_this=ptr_first=(struct student*)NULL; 
    while(1) 
    { 
     PrintMenu(); 
     choice=getche(); 
     switch(choice) 
     { 
      case '1': 
      AddRecord(); 
      break; 
      case '2': 
      DeleteRecord(); 
      break; 
      case '3': 
      SearchRecord(); 
      break; 
      case '4': 
      SortRecord(); 
      break; 
      case '5': 
      PrintRecord(); 
      break; 
      case '6': 
      exit(0); 
      default: 
      printf("Enter a valid choice.\n"); 
      getch(); 
     } 
    } 

} 
void PrintMenu(void) 
{ 
    clrscr(); 
    printf("Database System.\n1.Add Record\n2.Delete Record\n3.Search Record \n4.Sort Records\n5.Display Records\n6.exit"); 

} 
void AddRecord(void) 
{ 
    char temp[100]; 
    int i; 
    struct student *ptr_new; 
    ptr_new=(struct student*)malloc(sizeof(struct student)); 
    if(ptr_new==(struct student*)NULL) 
    { 
     printf("Sorry but you can not add any more data becasue the computer memory is full.\n"); 
     return; 
    } 
    printf("Enter Name:\n"); 
    gets(temp); 
    ptr_new->name=(char*)malloc(sizeof(char)*(strlen(temp)+1)); 
    strncpy(ptr_new->name,temp,strlen(temp)+1); 
    printf("Enter Roll no:"); 
    gets(temp); 
    ptr_new->roll_no=atoi(temp); 
    ptr_new->ptr_next=(struct student*)NULL; 
    if(ptr_first->ptr_next==(struct student*)NULL) 
    { 
     ptr_first=ptr_this=ptr_new; 
    } 
    else 
    { 
     ptr_this->ptr_next=ptr_new; 
     ptr_this=ptr_new; 
    } 
    printf("Record Successfully added.\n"); 
    printf("%s",ptr_this->name); 
    getch(); 
} 

void DeleteRecord(void) 
{ 
    char temp[100]; 
    int rec_no,i; 
    struct student* ptr_del,*ptr_prev; 
    printf("Enter Record Number to be Deleted:\n"); 
    gets(temp); 
    rec_no=atoi(temp); 
    ptr_del=ptr_prev=ptr_first; 
    for(i=0;ptr_del!=(struct student*)NULL;i++,ptr_del=ptr_del->ptr_next) 
    { 
     if(i==rec_no) 
     { 
      if(ptr_del==ptr_first) 
       ptr_first=ptr_first->ptr_next; 
      else 
       ptr_prev->ptr_next=ptr_del->ptr_next; 
      free(ptr_del); 
      printf("Record #%d has been deleted.",rec_no); 
      getch(); 
      return ; 
     } 
     ptr_prev=ptr_del; 
    } 


} 
void SearchRecord(void) 
{ 
    struct student *ptr_search; 
    char temp[100]; 
    int roll,flag=0; 
    clrscr(); 
    printf("Enter roll no to search:\n"); 
    gets(temp); 
    roll=atoi(temp); 
    ptr_search=ptr_first; 
    for(;ptr_search!=(struct student*)NULL;ptr_search=ptr_search->ptr_next) 
    { 
     if(ptr_search->roll_no==roll) 
     { 
     flag=1; 
     printf("Result Found!\nName:\t%s\nRoll #:\t%d\n",ptr_search->name,ptr_search->roll_no); 
     getch(); 
     return; 
     } 
    } 
    if(flag==0) 
    printf("Record not found!\n"); 
    getch(); 

} 
void SortRecord(void) 
{ 
    struct student *out,*in,*dummy; 
    for(out=ptr_first;out!=(struct student*)NULL;out=out->ptr_next) 
    { 
     for(in=out->ptr_next;out->ptr_next!=(struct student*)NULL;in=in->ptr_next) 
     { 
      if(!(strcmpi(out->name,in->name))) 
      *dummy=*in; 
      *in=*out; 
      *out=*dummy; 
      dummy=in; 
      in=out; 
      out=dummy; 
     } 
    } 
    printf("Records have been successfully sorted."); 
} 
void PrintRecord(void) 
{ 
    printf("HEllo"); 
    getch(); 
    struct student *ptr_print; 
    ptr_print=ptr_first; 
    for(;ptr_print!=(struct student*)NULL;ptr_print=ptr_print->ptr_next) 
    { 
     printf("NAME:\t%s\nROLL#:\t%d\n",ptr_print->name,ptr_print->roll_no); 
     printf("Press Enter to display next record or space to exit"); 
     getch(); 
    } 


} 
+0

Определить «не работает». –

+0

его не печатает список. Я добавил заявление hello, чтобы проверить, есть ли проблема с вызовом функции, но его печать приветствия. Проблема связана с кодом в функции печати –

+0

Тупой вопрос: знаете ли вы, что вы положили 'getch()' в функции печати? – rano

ответ

2

Функция печати в порядке, но это подозрительно:

if(ptr_first->ptr_next==(struct student*)NULL) 
{ 
    ptr_first=ptr_this=ptr_new; 
} 
else 
{ 
    ptr_this->ptr_next=ptr_new; 
    ptr_this=ptr_new; 
} 

Я бы сказал, что условие следует читать

if(ptr_first==NULL) 

не знаю, почему вы не получите ошибки сегментации в этом месте ...

+0

Я использую тип NULL для типа структуры. –

+0

Да, это необязательно (кроме разбитого компилятора/библиотек). Вы могли бы просто протестировать против «0». Однако достоинства не в RHS '==', а в LHS. – jpalecek

+0

Работа: D спасибо: D –

1

Ваш код должен быть поврежден, когда вы пытаетесь добавить сообщение (ptr_first всегда равно null). Если вы не вызываете AddRecord, неудивительно, что PrintRecord ничего не выводит - ptr_first по-прежнему равно нулю.

+0

снова просмотрите код, он указывает на недавно добавленную запись. –

Смежные вопросы