用c语言写代码 :分别写出顺序表和链式表的插入元素,删除元素的完整程序,并能实现运行,分析其知识背景,原理分析及复杂度分析
时间: 2024-09-20 17:16:54 浏览: 37
数据结构(C语言版):第2章线性表.ppt
在C语言中,顺序表(数组)和链式表(结构体+指针)的插入和删除操作有明显的区别。
### 顺序表(数组实现)
**顺序表插入元素:**
```c
#include <stdio.h>
#define MAX_SIZE 10
typedef int Element;
// 序列型数组
Element seq[MAX_SIZE];
void insert_seq(int index, Element value) {
if (index >= 0 && index < MAX_SIZE) {
memmove(seq + index + 1, seq + index, sizeof(Element) * (MAX_SIZE - index));
seq[index] = value;
} else {
printf("Index out of range.\n");
}
}
// 删除元素(这里假设删除的是最后一个元素)
void delete_seq() {
if (seq[MAX_SIZE - 1] != 0) {
for (int i = MAX_SIZE - 2; i >= 0; i--) {
seq[i] = seq[i + 1];
}
seq[MAX_SIZE - 1] = 0;
} else {
printf("List is empty.\n");
}
}
```
**原理分析:**
顺序表插入是在固定位置进行,需要移动其他元素;删除则通常从后向前遍历,直到找到空位。
**复杂度分析:**
- 插入:最好情况O(1),最坏情况O(n),平均情况O(n),因为可能需要移动所有元素。
- 删除:时间复杂度总是O(n),因为要遍历整个列表。
### 链式表(链表实现)
**链式表插入元素:**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void insert_link(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
void delete_link(Node** head) {
if (*head != NULL) {
Node* temp = *head;
*head = (*head)->next;
free(temp);
} else {
printf("List is empty.\n");
}
}
```
**原理分析:**
链表插入只需修改头节点指向即可,不需要移动其他元素;删除则是直接更新头节点。
**复杂度分析:**
- 插入:无论在链表的头部还是尾部,时间复杂度都是O(1)。
- 删除:也是O(1),因为只涉及到两个节点的操作。
阅读全文