Langdon1996
罗蜜斯丹
2016-04-14 16:12
采纳率: 57.1%
浏览 1.5k

双向动态链表存在学生信息!删除第一个学生信息时程序崩溃?

//输入学生信息后,凡是删除第一个学生的信息程序都会崩溃??

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

struct Student //完全可以把结构当成类,只是访问权限不一样 
{
    long num;//学号 
    char name[20];//姓名  
    char sex[10];//性别 
    int age;//年龄 
    char phone[11];//电话 
    struct Student *next;
    struct Student *pre;//双向动态不熟悉?
}; 

struct 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=curr;
            last=curr;
            curr->pre=NULL;
            curr->next=NULL;
        }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 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;
    while(curr)
    {
        if(curr->num==num)
        {
            (curr->pre)->next = curr->next;
            free(curr);
        }
        else
        {
            curr=curr->next; 
        }
    }
    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;
};
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • Langdon1996
    罗蜜斯丹 2016-04-15 05:50
    已采纳

    //这是我最新修改后的代码
    //空出头部和尾部,谢谢大家的指点啦!

      #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    #define LEN sizeof(struct Student)
    
    struct Student //完全可以把结构当成类,只是访问权限不一样 
    {
        long num;//学号 
        char name[20];//姓名  
        char sex[10];//性别 
        int age;//年龄 
        char phone[11];//电话 
        struct Student *next;
        struct Student *pre;//双向动态不熟悉?
    }; 
    
    struct 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();//空出尾部
                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;
        while(curr)
        {
            if(curr->num==num)
            {
                (curr->pre)->next = curr->next;
                free(curr);
            }
            else
            {
                curr=curr->next; 
            }
        }
        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;
    };
    
    点赞 评论
  • caozhy
     void Delete(int num)
    {
        curr=head;
        while(curr)
        {
            if(curr->num==num)
            {
                (curr->pre)->next = curr->next;
                free(curr); 
                break; //加上
            }
            else
            {
                curr=curr->next; 
            }
        }
        cout<<"已经删除学生信息"<<endl;
    }
    
    点赞 评论
  • NK_test
    NK_test 2016-04-14 16:25

    Delete函数中,(curr->pre)—>next这句错误。curr—>pre是null指针,不是对象,没有next成员,造成错误。
    一般我们都在链表头部再加一个头节点,方便操作。

    点赞 评论
  • u010846046
    L_huiyin 2016-04-14 18:57

    除了curr—>pre是null指针,还要(curr->next)—>pre = curr—>pre

    点赞 评论

相关推荐