C++中单项链表的结点删除问题——为什么我的链表编译能过,但是运行的时候显示:*** Error in `./list': free(): invalid pointer: 0x08ba20cc *** 已放弃 (核心已转储)

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4
  5 struct student{
  6     int my_id;
  7     char name[20];
  8     int my_age;
  9     int my_score;
 10     student *next = nullptr;
 11     student() = default;
 12     student(int id,const char *n,int age,int score)
 13         {my_id = id;my_age = age;my_score = score;strcpy(name,n);}
 14     ~student(){}
 15 };
 16 struct stu_list{
 17     stu_list() = default;
 18     ~stu_list(){};
 19     int creat_list();
 20     void show_list();
 21     int add_list(int num,const char *nn,int a,int s);
 22     int remove_list(int nm);
 23     int release_list();
 24 private:
 25     student * head = nullptr;
 26 };
 27 int stu_list::creat_list()
 28 {
 29     student *p = nullptr;
 30     int ret;
 31     while(1)
 32     {
 33         p = new student();
 34        if(!p){perror ("new error");return -1;}
 35        ret=scanf("%d %s %d %d",&p->my_id,p->name,&p->my_age,&p->my_score);
 36        if(ret < 0){break;}
 37        if(head == nullptr){
 38                p->next = nullptr;
 39             head = p;
 40        }else{
 41                p->next = head;
 42             head = p;
 43        }
 44     }//end while(1)
 45     return 0;
 46
 47 }
 48 void stu_list::show_list()
 49 {
 50     student *p = head;
 51     printf("学号\t姓名\t\t年龄\t成绩\n");
 52     while(p)
 53     {
 54         printf("%d\t%s\t%d\t%d\n",p->my_id,p->name,p->my_age,p->my_score);
 55         p = p->next;
 56     }
 57 }
 58 int stu_list::add_list(int num,const char *nn,int a,int s)
 59 {
 60     student *p = nullptr;
 61     p = new student(num,nn,a,s);
 62        if(head == nullptr){
 63                p->next = nullptr;
 64             head = p;
 65        }else{
 66                p->next = head;
 67             head = p;
 68        }
 69     return 0;
 70 }
 71
 72 int stu_list::remove_list(int nm)
 73 {
 74     student *p,*q;
 75    p = head;q = head;
 76     while(p){    //查找要删除的结点
 77     if( p->my_id == nm){break;}
 78     q = p;
 79     p = p->next;
 80     }//end while
 81     if(p != nullptr)
 82     {
 83         if(p == head)
 84             {
 85                 if(p->next == nullptr){
 86                     head = nullptr;
 87                 }else{
 88                     head = head->next;
 89                 }
 90             }
 91         else{
 92             if(p->next == nullptr){q->next = nullptr;}
 93             else{q->next = p->next;}
 94         }
 95         delete [] p;
 96         return 0;
 97     }//end first if
 98     return -1;
 99 }
100 /*
101 int stu_list::release_list()
102 {
103     student *p = head;
104     student *tmp = head;
105     while(p)
106     {
107         tmp = p->next;
108         delete [] p;
109         p = tmp;
110     }
111 }
112 */
113 int main()
114 {
115     stu_list stu;
116     stu.creat_list();
117     stu.show_list();
118     cout<<"==========================================="<<endl;
119     stu.add_list(10006,"niwangba",21,65);
120     stu.show_list();
121     cout<<"==========================================="<<endl;
122     stu.remove_list(10006);
123     stu.show_list();
124
125 //    stu.release_list();
126     return 0;
127 }

为什么我的链表编译的时候能通过,但是运行的时候却显示:*** Error in `./list‘: free(): invalid pointer: 0x08ba20cc *** 已放弃 (核心已转储)?

求解决方法。还有就是这段代码能优化吗?

C++中单项链表的结点删除问题——为什么我的链表编译能过,但是运行的时候显示:*** Error in `./list': free(): invalid pointer: 0x08ba20cc *** 已放弃 (核心已转储)

时间: 2024-10-07 08:10:04

C++中单项链表的结点删除问题——为什么我的链表编译能过,但是运行的时候显示:*** Error in `./list': free(): invalid pointer: 0x08ba20cc *** 已放弃 (核心已转储)的相关文章

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

删除mac 自带的python2.7后,XCODE运行失败,如下图,重装python2.7后解决,以后不敢乱动了。

删除mac 自带的python2.7后,XCODE运行失败,如下图,重装python2.7后解决,以后不敢乱动了.

【Leetcode解题报告】单链表结点删除相关问题

Leetcode 203 Remove Linked List Elements 问题描述 Remove all elements from a linked list of integers that have value val. For example, given 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6, val = 6. Return 1 -> 2 -> 3 -> 4 -> 5. 分析与解法 遍历链表,用一个指针

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

删除moduleCache下文件解决预编译头文件

之前有在代码全部正确的情况下,遇到过下面的编译错误: fatal error: file '.....h' has been modified since the precompiled header '.....' was built. note: please rebuld precompiled header '....'. 解决方法是删除文件夹下/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache下的所有文件,然后

删除一个没有头节点链表中的某个节点

题目描述:给定一个链表,没有头节点,如何删除其中的某个随机节点呢? 分析:如果一个链表没有头节点的话,那么我们就不可以找到被删除节点的前面一个节点.如何按照这个思路来,就无法实现功能了. 不如我们换一个思路,删除节点的目的是什么?是要达到被删除节点中的data被删除,也就是说,我们实际上只需要删除该节点的data,而不是整个节点.如何实现呢?我们可以把需要删除节点的后面一个节点中的data,依次往前面赋值,并把此节点删除,即可.例如:ABCD三个节点,假如我们需要删除B节点,那么我们可以把C->

Excel删除重复数据及用公式筛选重复项并标记颜色突出显示

当表格记录比较多时,常常会有重复数据,而重复记录往往只希望保存一条,因此需要把多余的删除:在 Excel 中,删除重复数据有两种方法,一种是用“删除重复数据”删除,另一种是用“高级筛选”删除:其中前者删除重复数据后会在表格末尾留下空行,而后者不会.如果只想查看重复数据而不必删除,可以给重复数据标记颜色突出显示,这样会一目了然.另外,还可以用公式统计每条重复数据有几条或筛选出重复数据.以下是Excel删除重复数据及用公式筛选重复项并标记颜色的具体操作方法,操作中所用版本为 Excel 2016.

安装时出现 Runtiem error (at 62:321) SWbem Locator:服务不存在,或已被标记为删除 该怎么解决?

这是由wmi服务损坏引起的错误 修复WMI服务损坏的批处理程序 将下列代码复制到一个文本文件中,改名为fixwmi.bat,运行即可.需要一段时间,请大家耐心等候. =============================== FIXWMI.CMD ------------------------ @echo on cd /d c:\temp if not exist %windir%\system32\wbem goto TryInstall cd /d %windir%\system32\

寒假项目2-猴子选大王

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2015 年 1 月 30 日 * 版 本 号:v1.0 * * 问题描述:一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n,输出为大王的猴子是几号. * 输入描述:输入