我制作了以下不打印列表的链表。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 :(得分: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)
不确定为什么你没有在这个地方得到段错误......
答案 1 :(得分:1)
当您尝试添加消息时,您的代码应该崩溃(ptr_first始终为null)。如果你不调用AddRecord
那么PrintRecord
什么都不输出就不足为奇了 - ptr_first仍然是空的。