已知数列{1,3,5,9,23},完成以下操作 1)用链表保存该数列 2)在链表中删除一个元素(如删除3) 建议: 1. 设计创建空链表函数 2. 设计删除一个元素的函数。C语言,包含主函数和代码逐行解释
时间: 2024-03-21 14:41:33 浏览: 57
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct node {
int data;
struct node *next;
} Node;
// 创建空链表
Node *createList(int arr[], int len) {
Node *head = (Node *)malloc(sizeof(Node));
Node *p = head;
for (int i = 0; i < len; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = arr[i];
p->next = newNode;
p = p->next;
}
p->next = NULL;
return head;
}
// 删除指定元素
void deleteNode(Node *head, int target) {
Node *p = head->next;
Node *pre = head;
while (p != NULL) {
if (p->data == target) {
pre->next = p->next;
free(p);
return;
}
pre = p;
p = p->next;
}
printf("The target element is not in the list.\n");
}
// 打印链表
void printList(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int arr[] = {1, 3, 5, 9, 23};
int len = sizeof(arr) / sizeof(arr[0]);
Node *head = createList(arr, len);
printf("The original list: ");
printList(head);
deleteNode(head, 3);
printf("After deleting 3: ");
printList(head);
return 0;
}
```
代码解释如下:
1. 首先定义了链表结构体`Node`,包含数据`data`和指向下一个节点的指针`next`。
2. 然后定义了`createList`函数,用于创建空链表。该函数接受一个数组和数组长度作为参数,返回链表的头指针。在函数内部,先创建一个头结点,然后遍历数组中的元素,逐个创建新节点并将其插入到链表中。最后将尾节点的`next`指针置为`NULL`,返回头指针。
3. 接着定义了`deleteNode`函数,用于删除链表中的指定元素。该函数接受链表的头指针和要删除的元素值作为参数,无返回值。在函数内部,首先定义两个指针`p`和`pre`,分别指向当前节点和前一个节点。然后遍历链表,找到第一个值等于目标元素的节点,将其从链表中删除并释放内存。如果链表中没有找到目标元素,则输出提示信息。
4. 最后定义了`printList`函数,用于打印链表中的所有元素。该函数接受链表的头指针作为参数,无返回值。在函数内部,遍历链表中的所有节点,逐个输出其数据值。
5. 在`main`函数中,先定义了一个整型数组`arr`,表示给定的数列。然后调用`createList`函数创建出对应的链表,并输出原始链表中的所有元素。接着调用`deleteNode`函数删除元素值为3的节点,并输出删除后的链表中的所有元素。最后结束程序。
阅读全文