#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int m;
struct ListNode *L = readlist();
scanf("%d", &m);
L = deletem(L, m);
printlist(L);
return 0;
}
struct ListNode *deletem(struct ListNode *L, int m) {
struct ListNode* p = L, *pre = NULL;
while (p) { //有可能连续删除头结点
if (p->data == m) {
if (pre) { //pre不是NULL表示此时p指向的不是头结点
pre->next = p->next;
}
else { //pre是NULL表示此为头结点
L = p->next;
}
}
else {
pre = p; //如果不等 pre指针++
}
p = p->next; //不论如何都要往后指,同时也只能在这里写往后指
}
return L;
}
struct ListNode *readlist() {
struct ListNode *head = NULL, *pcur = NULL;
int num;
scanf("%d", &num);
while (num != -1) {
struct ListNode* pnew = (struct ListNode*)calloc(1, sizeof(struct ListNode));
pnew->data = num;
if (head == NULL) { //头结点指空
head = pnew; //头结点指新节点
pcur = pnew;
pnew->next = NULL; //记得置空 不置空 在delete判断的时候 明明进不去循环结果进去了
}
else {
pcur->next = pnew; //尾插法
pcur = pnew;
pnew->next = NULL;
}
scanf("%d", &num);
}
return head;
}
2021年3月7号 写链表写了tm快4个小时
原创还不让我发。