C语言编程实现: 1、正序生成单链表或者逆序生成单链表; 2、在生成的单链表中插入一个元素结点; 3、在单链表中删除一个元素结点并回收该结点。
时间: 2023-05-22 18:02:52 浏览: 82
1、正序生成单链表的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 在链表尾部插入一个元素
void insert(ListNode** head, int val) {
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
ListNode* cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = newNode;
}
}
// 反转链表
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* cur = head;
while (cur != NULL) {
ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
ListNode* head = NULL;
int n;
printf("请输入元素的个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int val;
printf("请输入第%d个元素的值:", i + 1);
scanf("%d", &val);
insert(&head, val);
}
printf("正序生成的链表为:");
printList(head);
printf("逆序生成的链表为:");
ListNode* reverseHead = reverseList(head);
printList(reverseHead);
return 0;
}
```
2、在链表中插入元素结点的实现:
```c
// 在链表中间插入一个元素
void insertNode(ListNode* prev, int val) {
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = prev->next;
prev->next = newNode;
}
int main() {
// ...
// 插入元素
ListNode* cur = head;
int pos;
printf("请输入要插入到哪个位置:");
scanf("%d", &pos);
for (int i = 1; i < pos; i++) {
cur = cur->next;
}
int val;
printf("请输入要插入的值:");
scanf("%d", &val);
insertNode(cur, val);
printf("插入元素后的链表为:");
printList(head);
// ...
}
```
3、在链表中删除元素结点并回收该结点的实现:
```c
// 删除链表中的元素
void deleteNode(ListNode** head, ListNode* cur) {
if (*head == cur) {
*head = (*head)->next;
} else {
ListNode* prev = *head;
while (prev->next != cur) {
prev = prev->next;
}
prev->next = cur->next;
}
free(cur);
}
int main() {
// ...
// 删除元素
cur = head;
int delVal;
printf("请输入要删除的值:");
scanf("%d", &delVal);
while (cur != NULL) {
if (cur->val == delVal) {
deleteNode(&head, cur);
break;
} else {
cur = cur->next;
}
}
printf("删除元素后的链表为:");
printList(head);
// ...
}
```