C++链表节点删除问题

rere02 2011-12-18 03:20:00
如下:


#include<iostream>
using namespace std;

struct book
{
int num;
float price;
book *next;
};

book *head = NULL;
book *creat()
{
book *p1, *p2;
p1 = new book;


cout <<"请输入图书编号,以0结束:";
cin >> p1->num;
if(p1->num != 0)
{
head = p1;
p2 = p1;
cout << "请输入图书价格:" ;
cin >> p1->price;
}
else
{
delete p1;
//p2->next = NULL;
return head;
}
while(p1->num != 0)
{
p2 = p1;
p1 = new book;
cout <<"请输入图书编号,以0结束:";
cin >> p1->num;
if(p1->num != 0)
{
cout << "请输入图书价格:" ;
cin >> p1->price;
}
p2->next = p1;
}
delete p1;
p2->next = NULL;
return head;
}

void print(book *head)
{
cout << endl;
while(head)
{
cout << "图书编号为:" << head->num <<"\t";
cout << "图书价格为:" << head->price << "\t";
head = head->next;
cout << endl;
}
}

void delete1(book *head, int num)
{
book *l;
if(head->num == num) //输入的编号为第一个节点时
{
l = head;
::head = head->next;
delete l;
cout << "操作成功"<< endl;
return;
}
while(head)
{
if(head ->next == NULL)
{
cout << "找不到输入的编号节点" << endl;
return;
}

if(head->next->num == num)
{
l = head->next;
head->next = l->next;
delete l;
cout << "操作成功" << endl;
return;
}
head = head->next;

}
cout << "找不到输入的编号节点" << endl;
}
int main()
{
book *a;
a = creat();
print(a);
cout << "请输入要删除的节点图书编号:" << endl;
int booknum;
cin >> booknum;
delete1(a, booknum);
print(a);
return 0;
}



当我删除第一个节点的时候,后面的节点不会往上移;
各位大吓帮忙看看,小弟先谢了~~~
...全文
517 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linux-Torvalds 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rere02 的回复:]

引用 4 楼 johnkey_chen 的回复:
把delete1函数声明改为void delete1(book* &amp;head, int num)
不然函数里的head = head->next是无效的
按你的写法,删除第一个元素后那个print()函数传进去的参数是空指针,这个函数相当于没执行


谢谢你哦。

问题我自己解决了,我在调用delete1(a, i……
[/Quote]分析得对,但是不要用全局变量撒。通常的做法是传一个head指针的引用进来。
  • 打赏
  • 举报
回复
好像是这么回事
Johnkey_Chen 2011-12-18
  • 打赏
  • 举报
回复
问题解决了就行~
不过既然用的是C++,就尽量用面向对象的思想吧,这个问题完全可以用一个链表类来实现,而且看起来也会简洁直观~
PS:顺便就结贴给点分吧...这年头在那群牛人眼前赚点分不容易啊
rere02 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 johnkey_chen 的回复:]
把delete1函数声明改为void delete1(book* &head, int num)
不然函数里的head = head->next是无效的
按你的写法,删除第一个元素后那个print()函数传进去的参数是空指针,这个函数相当于没执行
[/Quote]

谢谢你哦。

问题我自己解决了,我在调用delete1(a, int num)的时候,
a=creat();a相当于是head的副本,,在操作的时候,虽然数据是删掉了,但地址还是存在的,
所以就出现了只删掉了数据, 但节点还存在;

因为nead是全局对象,
所以我改成了:delete1(nead, int num);
问题就解决了;

不知道我自己分析得对不对。大吓们也给我分析一下呀。
Johnkey_Chen 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shenxinji 的回复:]

引用 4 楼 johnkey_chen 的回复:
把delete1函数声明改为void delete1(book* &amp;head, int num)
不然函数里的head = head->next是无效的
按你的写法,删除第一个元素后那个print()函数传进去的参数是空指针,这个函数相当于没执行

你这样对删第一个有用,删其它的头指针会变,其它会乱的
[/Quote]
你一说还真是这样...怪不得刚才总觉得有些别扭
这个问题可以在delete1函数里再声明一个book指针并初始化为传进的参数解决
黯然 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 johnkey_chen 的回复:]
把delete1函数声明改为void delete1(book* &head, int num)
不然函数里的head = head->next是无效的
按你的写法,删除第一个元素后那个print()函数传进去的参数是空指针,这个函数相当于没执行
[/Quote]
你这样对删第一个有用,删其它的头指针会变,其它会乱的
Johnkey_Chen 2011-12-18
  • 打赏
  • 举报
回复
还有,那个delete1看起来真别扭,改成remove或是其他的吧...
Johnkey_Chen 2011-12-18
  • 打赏
  • 举报
回复
把delete1函数声明改为void delete1(book* &head, int num)
不然函数里的head = head->next是无效的
按你的写法,删除第一个元素后那个print()函数传进去的参数是空指针,这个函数相当于没执行
rere02 2011-12-18
  • 打赏
  • 举报
回复
没人知道吗?
rere02 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackhanzy 的回复:]
顺序表,当你删除一个元素时,其实并没删除那快内存,而是后面的元素依次前移,当前长度减一,而链表是删除结点,头指针指向删除后的那个结点。删除第一个结点:p=first;first = first->link;delete p,
[/Quote]

现在的问题的是后面的节点没有往前移。。。
阿尔博特 2011-12-18
  • 打赏
  • 举报
回复
顺序表,当你删除一个元素时,其实并没删除那快内存,而是后面的元素依次前移,当前长度减一,而链表是删除结点,头指针指向删除后的那个结点。删除第一个结点:p=first;first = first->link;delete p,

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧