#include<stdio.h>
#include<stdlib.h>
typedef struct LinkList
{
int num;
struct LinkList* next;
}List;
int main()
{
int n, k, i;
scanf_s("%d", &n);
List* head=NULL, * p1=NULL, * p2=NULL, * p=NULL;
for (i = 0; i < n; i++)
{
p1 = new List;
scanf_s("%d", &p1->num);
if (head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
}
p1->next = NULL;
scanf_s("%d", &k);
p1 = head; p2 = p1;
while (p1)
{
if (p1->num == k)
{
if (p1 == head)
head = p1->next;
else if (p1->next == NULL)
p2->next = NULL;
else
{
p = p1;
p2->next = p1->next;
delete p;
}
}
p2 = p1;
p1 = p1->next;
}
p = head;
while (p)
{
printf("%d ", p->num);
p = p->next;
}
p1 = p2 = head;
while (p1)
{
p2 = p1->next;
delete p1;
}
}
暂时看来你最后删除链表有问题,line53-line57,只删了一个节点,delete p1之后p1就等于null了
然后不知道链表需不需要头结点,有些可能需要一个head结点,head->next才开始存放数组的值
修改见注释处,供参考:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkList
{
int num;
struct LinkList* next;
}List;
int main()
{
int n, k, i;
scanf("%d", &n);
List* head=NULL, * p1=NULL, * p2=NULL, * p=NULL;
for (i = 0; i < n; i++)
{
p1 = new List;
scanf("%d", &p1->num);
if (head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
}
p1->next = NULL;
scanf("%d", &k);
p1 = head; p2 = p1;
while (p1)
{
if (p1->num == k)
{
if (p1 == head)
{
head = p1->next;
delete p1; //修改
p1 = head; //修改
}
//else if (p1->next == NULL)//修改
// p2->next = NULL; //修改
else
{
//p = p1; 修改
p2->next = p1->next;
delete p1;
p1 = p2; //修改
}
}
else{ //修改
p2 = p1;
p1 = p1->next;
}
}
p = head;
while (p)
{
printf("%d ", p->num);
p = p->next;
}
//p1 = p2 = head; 修改
while (head)
{
p = head; //修改
head = head->next;//p1 = p1->next;
delete p; //修改
}
return 0;
}
if (p1 == head)
head = p1->next;
你不能修改head啊,改了就永远找不到链表头了