读书人

链表节点删除之后怎么恢复

发布时间: 2012-06-22 16:16:32 作者: rapoo

链表节点删除之后如何恢复
我现在在做一个c语言课程设计,学生成绩管理系统。其中有一个功能是:恢复记录函数,能恢复被删除的任一学生记录。我的理解是要能选择性的恢复,就是恢复指定的学生信息。这个函数应该怎么写?
我写的删除函数是这样的:
struct student *del(struct student *head)
{
struct student *p1,*p2;
char num[N];
printf("\n\n\n请输入要删除学生的学号:");
scanf("%s",num);
if(head==NULL)
{
printf("\n还没有输入记录,请先输入学生成绩!\n");
goto end;
}
p1=head;
while(strcmp(num,p1->number)!=0)
{
if(p1->next ==NULL)
break;
p2=p1;
p1=p1->next ; /*当前节点地址由p1赋给p2,p1指向下一结点*/
}
if(strcmp(num,p1->number)==0)
{
if(p1==head)
{
head=p1->next ;
free(p1);
}
else
{
p2->next =p1->next ;
free(p1);
}
n=n-1;
printf("\n%s的成绩记录已删除!\n",num);
}
else
printf("\n没有这个学生的记录!请确认后再输入.\n");
end:
return head;
}
请高手帮帮我,真心感谢!

[解决办法]

C/C++ code
//以下仅供参考 如果要涉及到对文件操作的话 最后退出程序是也把垃圾链中的内容写到了一个文件中去,下次启动程序时把存垃圾的那个文件中的内容读到内存中建立垃圾链表。//***********按编号删除图书信息*****STU *delhead = NULL;//这个要放到mian函数里面跟head一样定义哦STU *numdel(STU *head){    STU *p1, *p2;    char num[10];        p1 = head;    printf("请输入需要删除图书的编号\n");    scanf("%s", num);    getchar();    if (head == NULL)    {        printf("\n*****空链表******\n");        return NULL;    }    while ((strcmp(num, p1->num) != 0) && p1->next != NULL)    {        p2 = p1;        p1 = p1->next;    }    if (strcmp(num, p1->num) == 0)      {        if(p1 == head)        {            head = p1->next;        }        else         {            p2->next = p1->next;        }            printf("*******成功删除该图书记录******\n");        //free(p1);        if (delhead == NULL)//另外建一个垃圾回收链表,将删除后的垃圾都装在这个链表里        {            delhead = p1;            p1->next = NULL        }        else        {            p1->next = delhead->next;            delhead = p1;        }    }    else    {        printf("******书号为%s的图书没有找到******\n",num);    }        return(head);}//************从垃圾链中找回被删除编号的图书******void refind(char *num, STU *head){    int n = 0;    STU *p = delhead, *p1;    while ((n = strcmp(p->num, num)) != 0 && p->next != NULL)    {        p1 = p;        p = p->next;    }    if (n == 0)//如果找到则从垃圾链中取下来头接到不是垃圾的那个链表中    {        p1->next = p->next;        p->next = head->next;        head = p;    }    else    {        printf("在垃圾链中没有找到你要找的被删除的对应编号的书\n");    }}
[解决办法]
该怎么删还不是自己来完成。只要你的删除操作不让数据消失就行。
两个链表。一个链表是正常数据链表。一个链表是已删除的垃圾链表。显示给别人看的就是正常数据链表。恢复的时候就从垃圾链表中恢复,然后把该数据从垃圾链表中删除就行了。。。

读书人网 >C语言

热点推荐