|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法实现上述操作
问题/疑惑:我使用的编译器为vs2022,程序编译运行之后没有输出删除元素x后的链表元素,程序没有报错,我重复看了几遍代码也没找出问题,望大佬指点一下,告诉我怎么改这一段代码才正确??
代码如下:
#include <iostream>
#include<stdlib.h>
using namespace std;
#define MAX 50
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * Linklist;
int a[MAX] = { 1,3,3,4 };
int length = 4;
void buildlist(Linklist& L)//把数组中的值放入新建的链表中
{
L = (LNode*)malloc(sizeof(LNode));
LNode* s, * r = L;
for (int i = 0; i < length; i++)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
r->next = s;
r = r->next;
}
}
void disp(Linklist L)//输出链表的值
{
LNode* s = L->next;
while (s)
{
cout << s->data;
s = s->next;
}
}
void deletex(Linklist& L, int x)//删除所有为x的元素
{
LNode* p = L->next, * r = L, * q;
while (p)
{
if (p->data != x)
{
r->next = p;
r = p;
p = p->next;
}
else
{
q = p;
p = p->next;
r->next = p;
free(q);
}
}
}
int main()
{
Linklist L;
buildlist(L);
cout << "删除前的链表为:" << endl;
disp(L);
cout << "删除后的链表为:" << endl;
deletex(L, 3);
disp(L);
}
根据你给出的代码,存在以下问题:
1. 在 `buildlist` 函数中,没有将最后一个结点的 next 置为 NULL,使得在后面遍历链表时,会遍历到一些未知区域,可能导致程序出错。
2. 在 `deletex` 函数中,当需要删除值为 x 的结点时,没有更新 r 的指向,使得在下一次循环迭代中,r 和 p 间隔了一个值为 x 的结点。这个问题可以通过在 if 语句块开始处新增 else if (p->next == NULL) { r = p; break; } 来解决,在判断当前结点是否是需要删除的结点时,如果是最后一个结点,则需要令 r 指向它,然后跳出循环。
修改后的代码如下:void buildlist(Linklist& L)//把数组中的值放入新建的链表中
{
L = (LNode*)malloc(sizeof(LNode));
LNode* s, * r = L;
for (int i = 0; i < length; i++)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL; // 将最后一个结点的 next 置为 NULL
}
void deletex(Linklist& L, int x)//删除所有为x的元素
{
LNode* p = L->next, * r = L, * q;
while (p)
{
if (p->data != x)
{
r->next = p;
r = p;
p = p->next;
}
else
{
q = p;
p = p->next;
r->next = p;
free(q);
}
// 新增代码,判断是否需要更新 r
if (p == NULL) { r = p; break; }
}
}
你可以试着编译并运行一下这份代码
有用请设置最佳答案
|
|