2 langdon1996 Langdon1996 于 2016.04.15 00:12 提问

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

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

 #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
Langdon1996   2016.04.15 13: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
caozhy   Ds   Rxr 2016.04.15 00:21
 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   Rxr 2016.04.15 00:25

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

NK_test
NK_test 回复Langdon1996: new一个结点phead,使curr->pre=phread
2 年多之前 回复
Langdon1996
Langdon1996 请问一下,那么应该如何修改呢?
2 年多之前 回复
u010846046
u010846046   2016.04.15 02:57

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
统计学生信息(使用动态链表完成)
描述 利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址) 其中,学号长度不超过20, 姓名长度不超过40, 性别长度为1, 地址长度不超过40 输入 包括若干行,每一行都是一个学生的信息,如: 00630018 zhouyan m 20 10.0 28#460 输入的最后以"end"结束 输出 将输入的内容倒序输出 每行一条记录,按照
计算概论(A) / 结构体与链表练习:3:统计学生信息(使用动态链表完成)
描述 利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址) 其中,学号长度不超过20, 姓名长度不超过40, 性别长度为1, 地址长度不超过40 输入 包括若干行,每一行都是一个学生的信息,如: 00630018 zhouyan m 20 10.0 28#460 输入的最后以"end"结束 输出 将输入的内容倒序输出 每行一条记录,按照
C/C++用动态链表实现对学生信息的存储
/************************************************************************/ /* 此程序是运用动态内存分配的手段来实现用链表的方式存储学生相关信息的。 链表,是一种自定义数据类型。在使用结构体数组或结构体指针存储复杂数据类型 时需要较大的连续的内存空间,若无需要长度的连续空间会致使操作失败, 并且使用结构体数组或结构体指针时
创建一个链表,可以插入学生信息、删除学生信息
//创建一个链表,可以插入学生信息、删除学生信息。 #include  #define NULL 0 #define TYPE  struct student #define LEN  sizeof (struct student) using namespace std; struct student  { int num; int age; struct stude
学生信息管理系统之问题汇总
学生信息管理系统完工已经有一段时间了,但是问题却像小草一样,野火烧不尽,春风吹又生。下面我们一起来看看几个常见的问题,这些问题你是否也曾遇到过。   1,对于文本框的内容是否设置了字符长度   由于数据库中的内容有长度限制,那么当我们在文本框中不做任何操作时,会出现这样的提示       2,没有查询结果时,是否注意了要弹出提示    在做学生信息管理系统时,查询信息你是否注意到了呢?
C语言写得学生管理系统
学生信息管理系统成品 动态链表 文件读写 排序 删除 插入 查找 and so on
c语言链表实现简单的学生信息管理系统
c语言实现, 链表初学使用, 文件读写, 已通过测试
链表实现一个学生信息统计的功能
#include #include #include /* 宏定义 */ #define NAMELEN 20 #define ADDRLEN 255 #define MAXAGE 150 #define MINAGE 1 #define MAXSCORE 100 #define MINSCORE 0 /* 定义学生信息*/ typedef struct StdInf
c语言大作业--链表实现学生成绩管理
本程序是用C语言实现的简单学生成绩管理,用到的主要知识点是链表,涉及到链表的建立,插入,节点的删除,排序等几乎所有的链表常用操作.模块强,可以根据需要自行裁减,原创作品!
C语言学生信息管理系统(动态链表版559)【不会】
代码: /* * C语言学生信息管理系统(动态链表版) * 作者:odaynot * 时间:2011年 * 功能:增添新键数据、修改删除数据、查询统计数据 * 平台:windows */ #include #include #include #include # define LEN sizeof(struct Student) struct Student { char