//2.11设计算法以删除链表中所有值为x的元素结点。
#include
#include
using namespace std;
#define max 100
typedef int element;
typedef struct sNode {
element data ;
struct sNode* next;
}node,*linkList ;
void initialList(node*&L ) {
L = new node;
L->next = NULL;
}
bool listDelete(node* L, element x=0) {
node* u;
node* p = L;//指向头结点
while (p->next->data != x && p != NULL) {
p = p->next;
}
if (p == NULL || p->next == NULL)
return false;
else {
u = p->next;
p->next = u->next;
delete u;
return true;
}
}
void listAdd(node* L) {
element x=0;
node* u, *R;
L = new node;
L->next = NULL;
R = L;
cout << "输入链表第一个元素(输入9999退出):";
cin >> x;
while (x != 9999) {
u = new node;
u->data = x;
u->next = NULL;
R->next = u;
R = u;
cout << "输入链表下一个元素(输入9999退出):";
cin >> x;
}
}
void listPrint(node* L) {
node* p = L;
while (p != NULL) {
cout << p->next->data;
p = p->next;
}
}
int main() {
node* L;
element x=0;
cout << "输入x的值为:";
cin >> x;
initialList(L);
listAdd(L);
listDelete(L, x);
listPrint(L);
}
源代码及题如上,
输入数据都没问题,就是最后按9999退出的时候什么都没打印出来
该回答引用GPTᴼᴾᴱᴺᴬᴵ
您的代码存在一些问题,可能是导致输出为空的原因:
在 listAdd 函数中,创建链表时需要传递链表的指针,但是在函数中直接重新定义了一个 L 变量,导致原链表指针 L 没有被修改,链表的内容也没有被修改。修改方法可以直接传入指针 L,然后在函数中通过指针修改链表的内容。
在 listPrint 函数中,循环遍历链表时,应该从链表的头结点开始,而不是从头结点的下一个节点开始,因为头结点本身并不存储数据。
以下是修改后的代码,您可以参考一下:
#include <iostream>
#include <stdlib.h>
using namespace std;
#define max 100
typedef int element;
typedef struct sNode {
element data;
struct sNode* next;
}node, *linkList;
void initialList(node*& L) {
L = new node;
L->next = NULL;
}
bool listDelete(node* L, element x = 0) {
node* u;
node* p = L; //指向头结点
while (p->next != NULL && p->next->data != x) {
p = p->next;
}
if (p->next == NULL)
return false;
else {
u = p->next;
p->next = u->next;
delete u;
return true;
}
}
void listAdd(node*& L) {
element x = 0;
node* u, * R;
R = L;
cout << "输入链表第一个元素(输入9999退出):";
cin >> x;
while (x != 9999) {
u = new node;
u->data = x;
u->next = NULL;
R->next = u;
R = u;
cout << "输入链表下一个元素(输入9999退出):";
cin >> x;
}
}
void listPrint(node* L) {
node* p = L->next;
while (p != NULL) {
cout << p->data;
p = p->next;
}
}
int main() {
node* L;
element x = 0;
cout << "输入x的值为:";
cin >> x;
initialList(L);
listAdd(L);
listDelete(L, x);
listPrint(L);
return 0;
}
代码中,listPrint函数中的while循环没有正确处理链表的头结点,导致输出时出现问题。你可以将while循环改为如下代码:
void listPrint(node* L) {
node* p = L->next;
while (p != NULL) {
cout << p->data;
p = p->next;
}
}
这样就可以正确输出链表了。