c语言写链表遇到的问题,问题出在删除,但是不知道是什么原因
```c
#include //双向链表
#include
typedef struct a {
int n;
struct a *last;
struct a *next;
} link;
link *creat();
int add(link *p, int aim);
link *find(int a, link *p);
int print(link *p);
int del(link *p, int aim);
int main() {
link *p;
p = creat();
add(p, 2);
add(p, 4);
print(p);
del(p, 4);
print(p);
}
link *creat() {
link *p;
p = (link *)malloc(sizeof(link));
p->last = p;
p->next = p;
p->n = 0;
return p;
}
int add(link *p, int aim) {
link *pp, *s;
pp = (link *)malloc(sizeof(link));
pp->next = p->next;
s = pp->next;
s->last = pp;
p->next = pp;
pp->last = p;
pp->n = aim;
return 1;
}
link *find(int a, link *p) {
link *pp;
pp = p;
do {
if (pp->n == a)
return pp;
pp = pp->next;
} while (pp != p);
return NULL;
}
int del(link *p, int aim) {
link *pp;
pp = find(aim, p);
printf("\n%d\n", pp->n);
printf("\n%d\n", pp->last->n);
if (pp = NULL) {
return 0;
} else {
printf("问题没出\n");
pp->last->next = pp->next;
printf("问题没出\n");
pp->next->last = pp->last;
free(pp);
}
return 1;
}
int print(link *p) {
link *pp;
pp = p;
int i = 0;
do {
i++;
printf("%d\t", pp->n);
pp = pp->next;
if (i && i % 10 == 0)
printf("\n");
} while (pp != p);
return 1;
}

“Devil组”引证GPT后的撰写:
问题似乎出在del()函数上。
这是有问题的一句话:
if (pp = NULL) {
变成双等于试试:
if (pp == NULL) {
还有
s = pp->next;
pp->next = p->next;
换成
pp->next = p->next;
s = pp->next;
代码写的是带头结点的双向链表,输出函数和删除函数及查找函数里,不能把头结点也包含在内,整体修改如下,改动处见注释,供参考:
#include <stdio.h>//双向链表
#include <stdlib.h>
typedef struct a {
int n;
struct a* last;
struct a* next;
}link;
link* creat();
int add(link* p, int aim);
link* find(int a, link* p);
int print(link* p);
int del(link* p, int aim);
int main() {
link* p;
p = creat();
add(p, 2);
add(p, 4);
//add(p, 3);
print(p);
del(p, 4);
//del(p, 2);
print(p);
return 0;
}
link* creat() {
link* p;
p = (link*)malloc(sizeof(link));
p->last = p;
p->next = p;
p->n = 0;
return p;
}
int add(link* p, int aim) {
link* pp, * s;
pp = (link*)malloc(sizeof(link));
pp->next = p->next;
s = pp->next;
s->last = pp;
p->next = pp;
pp->last = p;
pp->n = aim;
return 1;
}
link* find(int a, link* p) {
link* pp;
pp = p->next; //修改
while (pp != p) { //修改
if (pp->n == a)
return pp;
pp = pp->next;
}
return NULL;
}
int del(link* p, int aim) {
link* pp;
pp = find(aim, p);
if (pp == NULL) { //if (pp = NULL) 修改
return 0;
}
else {
//printf("\n%d\n", pp->n); //修改
//printf("\n%d\n", pp->last->n); //修改
printf("问题没出\n");
pp->last->next = pp->next;
printf("问题没出\n");
pp->next->last = pp->last;
free(pp);
}
return 1;
}
int print(link* p) {
link* pp;
pp = p->next; //修改
int i = 0;
while (pp != p) { //修改
i++;
printf("%d ", pp->n);
pp = pp->next;
if (i && i % 10 == 0)
printf("\n");
}
if (i % 10) printf("\n");//修改
return 1;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: