数据结构单链表删除操作

bingkilnara 2012-02-26 08:14:38
#include <iostream>
using namespace std;

struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
temp->num = n;
temp->pNext = NULL;

if(!pHead)
{
pHead = temp;
}
else
{
pEnd->pNext = temp;
}
pEnd = temp;
}

void DelList(int n)
{
Node* temp = pHead;
while(temp)//当节点不为空
{
if(temp!=pEnd)//如果不是尾结点,temp = temp->pNext
{
if(temp->num == n)//找到则删除
{
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
}
else //如果删除的是中间节点
{
Node* TempLast;
Node* LinShi;
TempLast->pNext = temp;
LinShi = temp->pNext;
TempLast->pNext = LinShi;
delete temp;
}
}
else//如果删除的是尾节点
{
Node* LinShi;
LinShi->pNext = temp;
pEnd = LinShi;
delete temp;
}
}
temp = temp->pNext;
}
}

void ShowList()
{
Node* temp = pHead;
while(temp)
{
cout<<temp->num<<" ";
temp = temp->pNext;
}
cout<<endl;
}

int main()
{
CreatList(1);
CreatList(2);
CreatList(3);
CreatList(4);
CreatList(5);
CreatList(6);
ShowList();

DelList(1);
ShowList();


system("pause");
return 0;
}


运行到删除操作的时候就崩了,没走下去,请问大家是什么原因;
谢谢大家先~
...全文
208 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingkilnara 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bingkilnara 的回复:]

6楼前辈的代码,按照你给的正确的思路改过了,但是当删除节点为尾节点时,输出了随机数,尾节点的这部分我是这样写的,C/C++ code
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
break;……
[/Quote]
这个发错了,删除尾部的代码是这样的
else if(temp == pEnd)//如果删除的是尾节点
{
tempBefore->pNext = temp;
pEnd = tempBefore;
delete temp;
break;
}
bingkilnara 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 czh3642210 的回复:]

删除单链表的其中某一个时,如果不是头结点,那么就要先搞个节点指向他的前一个,
1 -> 2 -> 3
pre temp
如上如果查到的是要删除temp,那么只需要pre->next = temp->next;然后delete temp;就好了
[/Quote]
谢谢8楼的总结,刚开始我就是这个没搞清楚,谢谢^^
bingkilnara 2012-02-26
  • 打赏
  • 举报
回复
6楼前辈的代码,按照你给的正确的思路改过了,但是当删除节点为尾节点时,输出了随机数,尾节点的这部分我是这样写的,
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
break;
}

相当于你那种的写法,但当dlelist(6)时,输出结果为:1 2 3 4 5 -1789162(随机数),是因为这个空间没有删掉么?请教,谢谢~
面包大师 2012-02-26
  • 打赏
  • 举报
回复
删除单链表的其中某一个时,如果不是头结点,那么就要先搞个节点指向他的前一个,
1 -> 2 -> 3
pre temp
如上如果查到的是要删除temp,那么只需要pre->next = temp->next;然后delete temp;就好了
a81895898 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bingkilnara 的回复:]

C/C++ code
#include <iostream>
using namespace std;

struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
……
[/Quote]
你这越改越乱了。。。把我的程序好好看一下,理解进去就行了。
xiyoulaoyuanjia 2012-02-26
  • 打赏
  • 举报
回复
晕 上面代码格式没有弄好 再发一个
struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
temp->num = n;
temp->pNext = NULL;

if(!pHead)
{
pHead = temp;
}
else
{
pEnd->pNext = temp;
}
pEnd = temp;
}

void DelList(int n)
{
Node* temp = pHead; // 指定需要删除的节点
Node* tempBefor=NULL; // 指定需要删除的节点的前一个
while(temp)//当节点不为空
{
if(temp!=pEnd)//如果不是尾结点,temp = temp->pNext
{
if(temp->num == n)//找到则删除
{
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
break;
}
else //如果删除的是中间节点
{
tempBefor->pNext=temp->pNext;

delete temp;
break;
}
}
else//如果删除的是尾节点
{
Node* LinShi;
LinShi->pNext = temp;
pEnd = LinShi;
delete temp;
break;
}
}
//没找到则继续
tempBefor=temp;
temp = temp->pNext;
}
}
void ShowList()
{
Node* temp = pHead;
while(temp)
{
cout<<temp->num<<" ";
temp = temp->pNext;
}
cout<<endl;
}
xiyoulaoyuanjia 2012-02-26
  • 打赏
  • 举报
回复
哥们上面的程序有点问题,哥们帮你改好了,代码如下
struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
temp->num = n;
temp->pNext = NULL;

if(!pHead)
{
pHead = temp;
}
else
{
pEnd->pNext = temp;
}
pEnd = temp;
}

void DelList(int n)
{
Node* temp = pHead; // 指定需要删除的节点
Node* tempBefor=NULL; // 指定需要删除的节点的前一个
while(temp)//当节点不为空
{
if(temp!=pEnd)//如果不是尾结点,temp = temp->pNext
{
if(temp->num == n)//找到则删除
{
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
break;
}
else //如果删除的是中间节点
{
tempBefor->pNext=temp->pNext;

delete temp;
break;
}
}
else//如果删除的是尾节点
{
Node* LinShi;
LinShi->pNext = temp;
pEnd = LinShi;
delete temp;
break;
}
}
//没找到则继续
tempBefor=temp;
temp = temp->pNext;
}
}
void ShowList()
{
Node* temp = pHead;
while(temp)
{
cout<<temp->num<<" ";
temp = temp->pNext;
}
cout<<endl;
}

bingkilnara 2012-02-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
temp->num = n;
temp->pNext = NULL;

if(!pHead)
{
pHead = temp;
}
else
{
pEnd->pNext = temp;
}
pEnd = temp;
}

void DelList(int n)
{
Node* temp = pHead;
while(temp)//当节点不为空
{
if(temp!=pEnd)//如果不是尾结点,temp = temp->pNext
{
if(temp->num == n)//找到则删除
{
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
temp = temp->pNext;
delete temp;
}
else //如果删除的是中间节点
{
Node* TempLast;
Node* LinShi;
TempLast->pNext = temp;
LinShi = temp->pNext;
TempLast->pNext = LinShi;
temp = temp->pNext;
delete temp;
}
}
}
else//如果删除的是尾节点
{
Node* LinShi;
LinShi->pNext = temp;
pEnd = LinShi;
temp = temp->pNext;
delete temp;
}
}
}

void ShowList()
{
Node* temp = pHead;
while(temp)
{
cout<<temp->num<<" ";
temp = temp->pNext;
}
cout<<endl;
}

int main()
{
CreatList(1);
CreatList(2);
CreatList(3);
CreatList(4);
CreatList(5);
CreatList(6);
ShowList();

DelList(1);
ShowList();


system("pause");
return 0;
}


二楼的前辈,这是我改过的程序,但是还是没有走DelList,麻烦您给说详细点,到底是ifelse的哪里错了?谢谢了~
bingkilnara 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]

C/C++ code
temp = temp->pNext;//你这儿错了,上边都把temp删掉了,这儿肯定出错啊
[/Quote]

这个问题改正了,还是不对,程序现在不走DelList这个函数,以至于只输出一个ShowList();

如果我这种删除的方法不对或者不好,请大家帮忙给一种方法:删除我给定的某个值,谢谢了
a81895898 2012-02-26
  • 打赏
  • 举报
回复
if else 有问题

#include <iostream>
using namespace std;

struct Node
{
int num;
Node* pNext;
};
Node* pHead = NULL;
Node* pEnd = NULL;

void CreatList(int n)//创建链表
{
Node* temp = new Node;
temp->num = n;
temp->pNext = NULL;
if(!pHead)
{
pHead = temp;
}
else
{
pEnd->pNext = temp;
}
pEnd = temp;
}

void DelList(int n)
{
Node* temp = pHead;
while(temp)//当节点不为空
{
while(temp!=NULL)//如果不是尾结点,temp = temp->pNext
{
if(temp->num == n)//找到则删除
{
if(temp == pHead)//如果删除的是头结点
{
pHead = temp->pNext;
delete temp;
}
else if(temp == pEnd)//如果删除的是尾节点
{
Node* LinShi;
LinShi->pNext = temp;
pEnd = LinShi;
delete temp;
}
else //如果删除的是中间节点
{
Node* TempLast;
Node* LinShi;
TempLast->pNext = temp;
LinShi = temp->pNext;
TempLast->pNext = LinShi;
delete temp;
}
}
temp=temp->pNext;
}
}
}

void ShowList()
{
Node* temp = pHead;
while(temp)
{
cout<<temp->num<<" ";
temp = temp->pNext;
}
cout<<endl;
}

int main()
{
CreatList(1);
CreatList(2);
CreatList(3);
CreatList(4);
CreatList(5);
CreatList(6);
ShowList();

DelList(1);
ShowList();


return 0;
}
面包大师 2012-02-26
  • 打赏
  • 举报
回复
temp = temp->pNext;//你这儿错了,上边都把temp删掉了,这儿肯定出错啊

64,654

社区成员

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

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