罗蜜斯丹 2016-04-15 16:23 采纳率: 0%
浏览 1422

C++双向动态链表记录删除-删除最后一个学生的信息时崩溃?

此代码为用双向动态链表记录并删除学生信息
为什么在delete函数里加入(curr->next)->pre=curr->pre后,先进行输入三个学生信息的操作,然后删除第三个学生信息的时候程序会**崩溃**
**目前注释了(curr->next)->pre=curr->pre;

  #include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define LEN sizeof(struct Student)

typedef struct Student 
{
    long num;//学号 
    char name[20];//姓名  
    char sex[10];//性别 
    int age;//年龄 
    char phone[11];//电话 
    struct Student *next;
    struct Student *pre;//双向动态链表 
}Student; 
//把head curr last定义为全局变量,下面函数就省下传参 
Student *curr,*head=NULL,*last;

void creat(void)
{

    while(1) 
    {  
        curr=(struct Student *)new Student();
        cout<<"请输入学生学号"<<endl;
        cin>>curr->num;
        cout<<"请输入学生姓名"<<endl;
        cin>>curr->name; 
        cout<<"请输入学生性别"<<endl;
        cin>>curr->sex;
        cout<<"请输入学生年龄"<<endl;
        cin>>curr->age;
        cout<<"请输入学生电话"<<endl;
        cin>>curr->phone;
        if(head==NULL){
            head=(struct Student*)new Student();//空出头部 
            head->next=curr;//
            curr->pre=head;
            last=curr;
        }else{
            last->next=curr;
            curr->next=NULL;
            curr->pre=last;
            last=curr;
        }

        cout<<"请选择操作,1表示继续录入,2表示结束"<<endl; 
        int b;
        cin>>b;
        if(b==1)continue;
        else if(b==2)
        {
            last= (struct Student*)new Student();//空出尾部,目的是使用free时候不崩溃? 
            last->pre=curr; 
             break;
        } 
    }
}

void print(int num)//链表的print函数
{
    curr=head;
    int a=0;
    while(curr)
    {
        if(curr->num==num)
        {
            cout<<"学号"<<curr->num<<endl;
            cout<<"姓名"<<curr->name<<endl;
            cout<<"性别"<<curr->sex<<endl;
            cout<<"年龄"<<curr->age<<endl;
            cout<<"电话"<<curr->phone<<endl;
            a=1;
            break;
         }

        curr=curr->next;
    }
    if(a==0)
    {
        cout<<"查无此人"<<endl; 
    }
}

void Delete(int num)
{
    curr=head;
    int c=1;
    while(curr)
    {
        if(curr->num==num)
        {
            (curr->pre)->next = curr->next;
                    //(curr->next)->pre=curr->pre;/*如果不注释此代码,输入三个学生信息,删除第三个学生信息的时候系统就会崩溃?*/
            free(curr);
            cout<<"已经删除学生信息"<<endl;
            c=0;
        }
            curr=curr->next; 
    }
    if (c)cout<<"对不起!系统没有找到此人"<<endl;
}
int main()
{
//  head=creat();//返回第一个结点的地址

    while(1)
    {
        cout<<"请选择你的操作"<<endl; 
        cout<<"1:学生信息录入"<<endl;
        cout<<"2:学生信息查询"<<endl;
        cout<<"3:请输入删除学生的学号"<<endl; 
        cout<<"4:退出"<<endl;
        int choice=0;
            cin>>choice;//输入选择 
        if(choice==1)
            {
                cout<<"请输入学生的信息"<<endl;
                creat();//返回第一个结点的地址
            }
        if(choice==2)
        {
            cout<<"请输入你查询的学生的学号"<<endl;
            int a ;
            cin>>a ;
            print(a);
        }
        if(choice==3)
        {
            cout<<"请输入你想要删除学生的学号"<<endl;
            int a;
            cin>>a;
            Delete(a) ;
        }
        if(choice==4)
            break;
    }
    return 0;
};
  • 写回答

3条回答

  • starsky_xkl 2016-04-15 16:38
    关注

    因为当你删除第三个对象的时候,curr->next指向的null(并没有实际的student对象),因此也不会含有student中的成员。删除最后一项时,把倒数第二项的的next指向null,再delete最后一项

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!