#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node* next;
} Node;
Node* buyNewNode() {
Node* newnode = (Node*)malloc(sizeof(Node));
newnode->next = NULL;
scanf("%d ", &(newnode->value));
return newnode;
}
Node* NodeInit() {
Node* newnode = (Node*)malloc(sizeof(Node));
newnode->next = NULL;
return newnode;
}
//用于输入数据-尾添
void tailPop(Node* head) {
while (head->next != NULL) {
head = head->next;
}
Node* newnode = buyNewNode();
head->next = newnode;
}
void del(Node* head, int num, int* last) {
Node* now = head;
Node* tmp = NULL;
*last = 0;
char flag = 0;//判断head是否找到要删除的数据
while (head->next != NULL) {
head = head->next;
(*last)++;
while (head->value == num) {
tmp = head;
if (head->next != NULL) {
head = head->next;
} else if (head->next == NULL) {
now->next = NULL;
(*last)--;
free(head);
return;
}
free(tmp);
flag = 1;
}
if (flag == 0) {
now = head;
} else {
now->next = head;
now = head;
flag = 0;
}
}
}
void printNode(Node* head) {
while (head->next != NULL) {
head = head->next;
printf("%d ", head->value);
}
printf("\n");
}
int main() {
int n, delnum, last;//last:剩余个数
Node* head = NodeInit();
scanf("%d", &n);
for (int i = 0; i <= n - 1; i++) {
tailPop(head);
}
scanf("%d", &delnum);
del(head, delnum, &last);
printf("%d\n", last);
printNode(head);
}
这道题的难点在于:
当删除最后一个节点时,上一个节点(非要删除的数字)的next应为NULL。
虽然free可以释放你删除的节点,但上一个节点的next仍保留着指针,在用node->next往下走时,会非法访问(因为你的节点已经free)。
所以就要使其next为NULL。



京公网安备 11010502036488号