用c语言写代码 :分别写出顺序表和链式表的插入元素,删除元素的完整程序,包括主函数,并能运行结果,分析其知识背景,原理分析及复杂度分析
时间: 2024-09-20 18:16:56 浏览: 41
在C语言中,顺序表和链式表的插入和删除操作有不同的实现方式。以下是两个简单版本的代码示例:
**顺序表(数组实现):**
```c
#include <stdio.h>
#define MAX_SIZE 10
// 顺序表结构体
typedef struct {
int data[MAX_SIZE];
int length;
} SeqList;
// 插入元素
void insert(SeqList* list, int index, int value) {
if (index >= 0 && index <= list->length) {
list->data[index] = value;
list->length++;
} else {
printf("Error: Index out of range.\n");
}
}
// 删除元素
void delete(SeqList* list, int index) {
if (index >= 0 && index < list->length - 1) {
memmove(&list->data[index], &list->data[index + 1], sizeof(int) * (list->length - index - 1));
list->length--;
} else {
printf("Error: Index out of range.\n");
}
}
int main() {
SeqList list;
list.length = 0;
// 示例:插入和删除元素
insert(&list, 0, 5);
insert(&list, 2, 10);
printf("After inserting:\n");
for (int i = 0; i < list.length; i++) {
printf("%d ", list.data[i]);
}
delete(&list, 1); // 删除第二个元素
printf("\nAfter deleting:\n");
for (int i = 0; i < list.length; i++) {
printf("%d ", list.data[i]);
}
return 0;
}
```
**链式表(单向链表实现):**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 链表头指针
Node* head;
// 插入节点
void insert(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
head = newNode;
}
// 删除节点
void delete(int value) {
Node* current = head;
Node* previous = NULL;
while (current != NULL && current->data != value) {
previous = current;
current = current->next;
}
if (current != NULL) {
if (previous == NULL) {
head = current->next;
} else {
previous->next = current->next;
}
free(current);
} else {
printf("Error: Element not found.\n");
}
}
int main() {
insert(1);
insert(2);
insert(3);
// 示例:插入和删除元素
printf("Before deletion:\n");
Node* temp = head;
while (temp != NULL) {
printf("%d ->", temp->data);
temp = temp->next;
}
delete(2); // 删除值为2的节点
printf("\nAfter deletion:\n");
temp = head;
while (temp != NULL) {
printf("%d ->", temp->data);
temp = temp->next;
}
return 0;
}
```
**知识背景、原理分析及复杂度分析:**
- **顺序表(数组):** 主要基于连续内存空间,插入和删除的时间复杂度通常是O(n),因为需要移动其他元素来保持序列有序。
- **链式表(单向链表):** 使用动态内存分配,插入在头部的时间复杂度为O(1),删除某个位置需要遍历,时间复杂度为O(n)。然而,删除尾部元素的时间复杂度为O(1)。
注意:实际编程时,链式表可能会比顺序表更适合频繁的插入和删除操作,因为它们不需要预先知道存储容量。如果对性能有极高要求,可以考虑双向链表或更复杂的数据结构。
阅读全文