请选择使用顺序表或链表(单链表或双链表)实现以下操作,要求设计菜单,并根据菜单提示进行操作。 (1)插入一个新元素到第i个位置。 (2)删除第i个位置的元素。 (3)显示线性表中所有元素的值。 (4)检索表中第i个元素。 (5)求表的长度。 用C语言编译成一个程序
时间: 2024-10-23 18:13:52 浏览: 17
为了实现上述操作,我们可以选择使用链表,因为它支持动态添加和删除元素而不需要像顺序表那样预先知道数组大小。这里我会分别描述如何使用单链表和双链表来实现这个功能:
**单链表实现:**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* create_list() {
return NULL;
}
void insert_at_index(Node** head, int i, int value) {
if (i <= 0) return; // 避免越界
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
for (int j = 0; j < i - 1 && *head != NULL; j++)
*head = (*head)->next;
if (*head == NULL)
*head = newNode;
else
(*head)->next = newNode;
}
void delete_at_index(Node** head, int i) {
if (*head == NULL || i <= 0) return;
Node* temp = *head;
for (int j = 0; j < i - 1 && temp != NULL; j++) {
temp = temp->next;
}
if (temp == NULL) return;
if (temp->next == NULL) { // 如果删除的是最后一个元素
Node* temp2 = *head;
while (temp2->next != NULL)
temp2 = temp2->next;
free(temp2);
*head = NULL;
} else {
temp->next = temp->next->next;
}
}
// 其他函数如显示元素、检索、求长度类似,省略
```
**双链表实现:**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// ... 同样的创建节点和链表头的操作...
void insert_at_index(Node** head, int i, int value) {
// ... 插入逻辑同上,只是修改prev指针...
}
void delete_at_index(Node** head, int i) {
// ... 删除逻辑同上,需要同时处理prev和next指针...
}
// ... 另外两个额外的函数(前驱节点和后继节点)...
```
你可以根据需求,选择单链表或双链表编写完整程序,包括主菜单循环、用户输入验证等部分。
阅读全文