用C语言实现,输入若干正整数,输入-1时结束,建立单向链表,再输入一个整数m,删除链表中值为m的所有结点。
时间: 2024-05-10 22:16:15 浏览: 86
C语言实现单向链表的创建、插入,删除节点,和2个链表合并
5星 · 资源好评率100%
以下是用C语言实现输入若干正整数,建立单向链表,再输入一个整数m,删除链表中值为m的所有结点的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新结点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入结点到链表尾部
void insertNode(Node** head, int data) {
if (*head == NULL) {
*head = createNode(data);
} else {
Node* cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = createNode(data);
}
}
// 删除链表中值为m的所有结点
void deleteNode(Node** head, int m) {
Node* cur = *head;
Node* prev = NULL;
while (cur != NULL) {
if (cur->data == m) {
if (prev == NULL) {
*head = cur->next;
} else {
prev->next = cur->next;
}
free(cur);
cur = prev == NULL ? *head : prev->next;
} else {
prev = cur;
cur = cur->next;
}
}
}
// 打印链表
void printList(Node* head) {
Node* cur = head;
while (cur != NULL) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
int data;
do {
printf("请输入一个正整数(输入-1结束):");
scanf("%d", &data);
if (data != -1) {
insertNode(&head, data);
}
} while (data != -1);
printf("建立的链表为:");
printList(head);
int m;
printf("请输入要删除的值m:");
scanf("%d", &m);
deleteNode(&head, m);
printf("删除值为%d的结点后,链表为:", m);
printList(head);
return 0;
}
```
其中,我们定义了链表结点结构体`Node`,每个结点包含一个整数值`data`和指向下一个结点的指针`next`。我们还定义了三个函数,分别为`createNode`、`insertNode`和`deleteNode`。
`createNode`函数用于创建新结点,输入为结点的整数值,返回值为指向新结点的指针。
`insertNode`函数用于将新结点插入到链表尾部,输入为链表头结点的指针和新结点的整数值。
`deleteNode`函数用于删除链表中值为m的所有结点,输入为链表头结点的指针和要删除的值m。该函数使用两个指针,`prev`指向当前结点的前一个结点,`cur`指向当前结点。遍历链表,如果当前结点的值等于m,则删除当前结点并更新指针,否则更新指针继续遍历。
最后,我们在`main`函数中读入若干正整数并建立链表,再读入要删除的值m,调用`deleteNode`函数删除链表中值为m的所有结点,最后打印删除后的链表。
阅读全文