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

问题描述

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

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

 #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;
};

解决方案

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

  #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;
};

解决方案二:

 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;
}

解决方案三:

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

解决方案四:

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

时间: 2024-09-05 18:16:13

基础-双向动态链表存在学生信息!删除第一个学生信息时程序崩溃?的相关文章

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

问题描述 C++双向动态链表记录删除-删除最后一个学生的信息时崩溃? 此代码为用双向动态链表记录并删除学生信息 为什么在delete函数里加入(curr->next)->pre=curr->pre后,先进行输入三个学生信息的操作,然后删除第三个学生信息的时候程序会**崩溃** **目前注释了(curr->next)->pre=curr->pre: #include <iostream> #include <stdio.h> #include &l

c语言 链表-全班学生随机挑选n名学生显示信息并随即删除n名中一位

问题描述 全班学生随机挑选n名学生显示信息并随即删除n名中一位 解决方案 http://wenku.baidu.com/link?url=IMu1MqGTWnW9JH7S8yPcCRbxXWLseztY41bjN2y94G5C9Nqk7kVTgdiWHqqDDqK_UDj8cmslFMR5H8EFYgvkDODg1JC_Qni1dB0Igg9pfXC 顺便好奇问下,你们实训,"训"的是什么?连google怎么用老师都不教呢? 解决方案二: thank you,我们老师只是让我们自己写

c语言-链表对学生数据库学号、年龄等信息的读取,打印,销毁

问题描述 链表对学生数据库学号.年龄等信息的读取,打印,销毁 链表对数据库信息的读取,打印,销毁,要求使用C语言 ,尽量简单易懂,谢谢啊, 解决方案 http://www.cnblogs.com/renyuan/archive/2013/05/21/3091506.html

2014秋C++第19周 项目1参考 动态链表体验

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1 - 动态链表体验] 下面是一个建立动态链表的程序.阅读程序,在草稿纸上画出链表建立的过程,借此学会如何建立链表.然后按要求改造程序. #include <iostream> using namespace std; struct Node { int data; //结

C++第2周项目4——动态链表初试

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8635385 [项目4-动态链表初试]数据依然来自score.txt,在程序中建立一个动态链表:每读入一个同学的数据,计算总分,分配结点的存储空间并赋值,并建立起前后相链的关系.在建立链表的同时,要进行统计,以便于求出所有同学总分的平均成绩.动态链表建立后,从头

江西注销空壳网站 删除虚假网站备案信息5万个

中介交易 SEO诊断 淘宝客 云主机 技术大厅 新华网江西频道1月23日电(记者郭远明)为净化网络环境,维护网络安全,去年以来,江西省通过开展空壳网站集中注销专项工作,共注销空壳网站并删除虚假网站备案信息4.9万个. 江西省通信管理局负责人介绍,目前各地网络信息安全形势严峻,一些网站用户信息泄露事件时有发生.为此,江西省要求各基础电信企业加强移动互联网.智能终端和应用平台等新技术新业态安全管理;加强互联网基础管理工作,尤其要认真做好网站备案等基础工作,注销空壳网站,提高网站备案信息准确率. 去年

ASP.NET中运用动态构建语句高效批量删除解析

gridview中做批量删除.我们一般的做法是循环到勾选的就调用过程直接删除.这样的话个人觉得效率不是很高,如果是上百上千的数据要删除,那就得调用试行上百次.其实我们可以运用动态构建删除语句进行高效批量删除,无论你选多少要删除的数据,只需调用试行一次. 底下写的存储过程删除语句与上图无关,上图是常见的在gridview中做批量删除.使用存储过程: 代码 ------------------------------------------------------------------------

PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)

我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取当前用户----目的是:该用户可以发表动态,重点是显示该用户好友及他自己发表的动态,并且按发表时间排序. (2)做个发表动态框实现发表动态功能 (3)显示该用户和他好友已经发表对的动态信息,并按发表时间由近到远显示 (4)再每条动态后面做一个评论按钮和删除按钮:实现对动态的评论,回复和删除(斜体部分下一

php+mysql删除指定编号员工信息的方法

 这篇文章主要介绍了php+mysql删除指定编号员工信息的方法,涉及mysql数据库操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php+mysql删除指定编号员工信息的方法.分享给大家供大家参考.具体分析如下: 利用php提交员工编号给mysql,然后由mysql把数据接受并利用delete进行数据删除操作了,这里就来给大家分享几个具体例子. delete语句的示例: 代码如下: delete from friends where user_name = 'si