用C语言,删除结点:输入若干个正整数(输入-1为结束标志),建立一个单向链表,再输入一个整数m,删除链表中值为m的所有结点。试编写 相应程序。
时间: 2023-06-26 07:05:32 浏览: 150
以下是基于C语言的单向链表删除结点的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建链表
ListNode* createList() {
int val;
ListNode* head = NULL;
ListNode* tail = NULL;
// 循环读取输入的整数,直到输入-1为止
while (1) {
scanf("%d", &val);
if (val == -1) {
break;
}
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
// 删除链表中所有值为m的结点
ListNode* deleteNode(ListNode* head, int m) {
ListNode* dummy = (ListNode*)malloc(sizeof(ListNode));
dummy->next = head;
ListNode* pre = dummy;
ListNode* cur = head;
while (cur != NULL) {
if (cur->val == m) {
pre->next = cur->next;
free(cur);
cur = pre->next;
} else {
pre = cur;
cur = cur->next;
}
}
return dummy->next;
}
// 打印链表
void printList(ListNode* head) {
ListNode* cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
// 创建链表
printf("请输入若干个正整数(以-1为结束标志):\n");
ListNode* head = createList();
// 删除链表中值为m的所有结点
int m;
printf("请输入要删除的整数m:\n");
scanf("%d", &m);
head = deleteNode(head, m);
// 打印链表
printf("删除后的链表为:\n");
printList(head);
return 0;
}
```
以上代码中,我们首先定义了一个链表节点结构体 `ListNode`,包含节点的值 `val` 和指向下一个节点的指针 `next`。然后,我们创建了一个函数 `createList()`,用于创建单向链表。该函数会循环读取输入的整数,直到输入-1为止,然后将这些整数存储在链表中。
接着,我们创建了一个函数 `deleteNode()`,用于删除链表中所有值为m的结点。该函数使用了双指针法,需要注意的是在删除结点后需要释放内存。
最后,我们创建了一个函数 `printList()`,用于打印链表。
在主函数中,我们先调用 `createList()` 函数创建链表,然后输入要删除的整数m,并调用 `deleteNode()` 函数删除链表中所有值为m的结点。最后,我们调用 `printList()` 函数打印删除后的链表。
阅读全文