用C语言编程实现线性表两种存储结构中的基本操作的实现(线性表的创建、插入、删除和查找),并设计一个主菜单完成各个功能的调用。
时间: 2024-11-05 08:24:41 浏览: 30
在C语言中,线性表的常见存储结构有顺序存储结构(数组)和链接存储结构(链表)。以下是这两种存储结构下线性表的基本操作的简单实现:
### 1. 顺序存储(数组)
```c
typedef struct Node {
int data;
int next;
} Node;
// 创建数组表示的线性表
void createArrayList(int* arr, int size) {
for (int i = 0; i < size; i++) {
arr[i] = 0;
}
}
// 插入元素
void insertArrayList(int* arr, int index, int value) {
if (index >= 0 && index < sizeof(arr)/sizeof(*arr)) {
memmove(&arr[index+1], &arr[index], sizeof(arr) - sizeof(*arr) * index);
arr[index] = value;
} else {
printf("Invalid index.\n");
}
}
// 删除元素
void deleteArrayList(int* arr, int index) {
if (index >= 0 && index < sizeof(arr)/sizeof(*arr)) {
memmove(&arr[index], &arr[index+1], sizeof(arr) - sizeof(*arr) * index);
} else {
printf("Invalid index.\n");
}
}
// 查找元素
int searchArrayList(const int* arr, int value, int size) {
for (int i = 0; i < size; i++) {
if (arr[i] == value) return i;
}
return -1; // 如果没找到,返回-1
}
```
### 2. 链表存储(单向链表)
```c
typedef struct List {
int data;
struct List* next;
} List;
// 创建链表
void createLinkedList(List** head, int value) {
*head = (List*)malloc(sizeof(List));
(*head)->data = value;
(*head)->next = NULL;
}
// 插入节点
void insertLinkedList(List** head, int index, int value) {
List* newNode = (List*)malloc(sizeof(List));
newNode->data = value;
newNode->next = NULL;
if (index == 0) {
newNode->next = *head;
*head = newNode;
} else {
List* current = *head;
for (int i = 0; i < index - 1 && current != NULL; i++) {
current = current->next;
}
if (current != NULL) {
newNode->next = current->next;
current->next = newNode;
} else {
printf("Invalid index.\n");
}
}
}
// 删除节点
void deleteLinkedList(List** head, int index) {
if (*head == NULL) return;
if (index == 0) {
List* temp = *head;
*head = (*head)->next;
free(temp);
} else {
List* current = *head;
for (int i = 0; i < index - 1 && current != NULL; i++) {
current = current->next;
}
if (current != NULL && current->next != NULL) {
current->next = current->next->next;
} else {
printf("Invalid index.\n");
}
}
}
// 查找节点
int searchLinkedList(List* head, int value) {
while (head != NULL) {
if (head->data == value) return 1;
head = head->next;
}
return 0; // 如果没找到,返回0
}
```
对于主菜单的实现,你可以设计如下的函数:
```c
void mainMenu() {
int choice;
while (1) {
printf("\n1. 创建数组列表\n2. 插入数组列表\n3. 删除数组列表\n4. 查找数组列表\n5. 创建链表\n6. 插入链表\n7. 删除链表\n8. 查找链表\n9. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1: createArrayList(...); break;
case 2: insertArrayList(...); break;
case 3: deleteArrayList(...); break;
case 4: ...searchArrayList(...); break;
case 5: createLinkedList(...); break;
case 6: insertLinkedList(...); break;
case 7: deleteLinkedList(...); break;
case 8: ...searchLinkedList(...); break;
case 9: exit(0);
default: printf("无效选择,请输入有效数字。\n");
}
}
}
```
阅读全文