已知数列{1,3,5,9,23},完成以下操作 1)用链表保存该数列 2)在链表中删除一个元素(如删除3) 建议: 1. 设计创建空链表函数 2. 设计删除一个元素的函数。C语言,包含主函数和代码逐行解释,整体思想,算法
时间: 2024-03-21 11:43:07 浏览: 52
好的,我会尽力回答你的问题。以下是代码及其解释:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建空链表
Node* createLinkedList(int arr[], int n) {
Node* head = NULL, *tail = NULL;
for (int i = 0; i < n; i++) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = arr[i];
p->next = NULL;
if (head == NULL) {
head = tail = p;
}
else {
tail->next = p;
tail = p;
}
}
return head;
}
// 删除链表中的一个元素
Node* deleteNode(Node* head, int val) {
Node* pre = NULL, *cur = head;
while (cur != NULL && cur->data != val) {
pre = cur;
cur = cur->next;
}
if (cur == NULL) {
printf("Element not found!\n");
return head;
}
if (pre == NULL) {
head = head->next;
}
else {
pre->next = cur->next;
}
free(cur);
return head;
}
int main() {
int arr[] = {1, 3, 5, 9, 23};
Node* head = createLinkedList(arr, 5);
// 打印原始链表
Node* p = head;
printf("Original List: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
// 删除元素3
head = deleteNode(head, 3);
// 打印删除元素后的链表
p = head;
printf("List after deletion: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
```
整体思路是:先定义一个链表节点结构体,包含元素值和指向下一个节点的指针;然后定义一个创建空链表的函数,遍历给定的数组,依次创建节点,并将节点连接起来形成链表;最后定义一个删除元素的函数,遍历链表,找到要删除的元素所在的节点,修改前驱节点的指针指向,释放要删除的节点的内存空间。
代码中的 `createLinkedList` 函数的参数包括一个整型数组和数组长度,返回值为链表的头节点指针。函数中先定义头节点指针和尾节点指针,然后遍历数组,依次创建节点,并将节点连接起来形成链表。
代码中的 `deleteNode` 函数的参数包括一个头节点指针和要删除的元素的值,返回值为删除元素后的头节点指针。函数中定义一个前驱节点指针和当前节点指针,遍历链表,找到要删除的元素所在的节点,修改前驱节点的指针指向,释放要删除的节点的内存空间。
在主函数中,先调用 `createLinkedList` 函数创建链表,然后打印原始链表,接着调用 `deleteNode` 函数删除元素3,最后打印删除元素后的链表。
需要注意的是,在 `deleteNode` 函数中,如果要删除的元素不在链表中,需要输出提示信息。此外,在删除头节点时,需要修改头节点指针;在删除非头节点时,需要修改前驱节点的指针。
阅读全文