c - 链接列表不打印列表

标签 c linked-list

我制作了以下链表,它没有打印列表。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();
    }


}

最佳答案

打印功能没问题,但这很可疑:

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)

不确定为什么你没有在这个地方遇到段错误......

关于c - 链接列表不打印列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631551/

相关文章:

C最大数计数

c - typedef 可见性

补二进制数

c - 运行C程序复制的二进制文件时出现段错误

c - 尝试通过冒泡排序对名称链接列表进行排序时出现段错误

Java - LinkedList 中的 "Rotating"对象 - LinkedList.addLast(LinkedList.removeFirst()) 是好编程还是坏编程?

c - 编译xmlrpc-c程序的问题

c - 在 C 中使用双向链表时出现问题

c - 链表内存图

C:循环链表 - 向多项式添加项