数据结构作业
数据结构概念核心要点
一、数据结构基础
-
数据、数据元素、数据项
- 数据:操作对象(文本、音视频等)。
- 数据元素:数据的基本单位(如一条记录)。
- 数据项:数据元素的不可再分的最小单位(如记录中的字段)。
-
逻辑结构
- 线性结构:元素一对一关系(如顺序表、链表)。
- 非线性结构:树(一对多)、图(多对多)。
- 特点:逻辑关系独立于存储方式。
-
物理结构
- 顺序存储:元素物理地址连续(如数组)。
- 链式存储:通过指针链接,地址不连续(如链表)。
- 哈希存储:基于哈希表实现快速访问。
顺序表核心要点
一、顺序表定义
-
特点
- 逻辑结构为线性结构,物理结构为顺序存储。
- 类似数组,但需额外记录实际元素个数(
len
字段)。
-
结构体定义
c
typedef struct {
int data[MAX]; // 存储数据的数组
int len; // 当前元素个数
} seq_list, *seq_p;
二、基本操作及实现逻辑
-
创建顺序表
- 动态申请内存(堆区),返回结构体指针。
- 代码示例:
c
seq_p create_seqlist() {
seq_p P = (seq_p)malloc(sizeof(seq_list));
if (P == NULL) return NULL;
P->len = 0; // 初始长度为0
return P;
}
-
插入操作
- 尾插:直接添加元素到末尾,时间复杂度 O(1)。
c
void insert_tail(seq_p P, int new_data) {
if (P->len >= MAX) return; // 判满
P->data[P->len++] = new_data;
}
- 头插:所有元素后移一位,时间复杂度 O(n)。
c
void insert_head(seq_p P, int new_data) {
for (int i = P->len; i > 0; i--)
P->data[i] = P->data[i-1];
P->data[0] = new_data;
P->len++;
}
- 按位置插入:需移动后续元素,时间复杂度 O(n)。
- 尾插:直接添加元素到末尾,时间复杂度 O(1)。
-
删除操作
- 头删:所有元素前移一位,时间复杂度 O(n)。
c
void del_head(seq_p P) {
for (int i = 0; i < P->len-1; i++)
P->data[i] = P->data[i+1];
P->len--;
}
- 按位置删除:类似头删,需移动元素。
- 头删:所有元素前移一位,时间复杂度 O(n)。
-
判满与判空
- 判满:
len == MAX
。 - 判空:
len == 0
。
- 判满:
-
按值查找
- 遍历顺序表,返回第一个匹配元素的下标,时间复杂度 O(n)。
三、关键注意事项
-
边界条件处理
- 插入/删除前需检查表是否已满或为空。
- 检查参数合法性(如指针是否为
NULL
)。
-
时间复杂度分析
- 插入/删除头部:O(n)(需移动元素)。
- 随机访问:O(1)(直接通过下标)。
四、作业与扩展
- 实现按位置插入/删除:需校验位置合法性(
0 ≤ pos ≤ len
)。void del_pos(seq_p P,int pos) { if(P==NULL||pos<0||pos>P->len||empty_seq(P)) { return; } for(int i=pos;i<P->len-1;i++) { P->data[i]=P->data[i+1]; } P->len--; } void find_pos(seq_p P,int pos) { if (P == NULL || pos< 0 || pos >= P->len || empty_seq(P)) { printf("位置无效或顺序表为空\n"); return; } printf("位置 %d 的值是 %d\n", pos, P->data[pos]); }
- 按值查找优化:可返回所有匹配位置或使用二分查找(若有序)。
void find_value(seq_p P, int value) { if (P == NULL || empty_seq(P)){ printf("未找到或顺序表为空\n");return; } for (int i = 0; i<P->len; i++) { if (P->data[i] == value) { printf("值 %d 在位置 %d 处找到\n", value, i); return; } } printf("未找到值 %d\n", value); }
- 刷题建议:牛客网《剑指Offer》或LeetCode“数组”分类题目。
总结
顺序表是线性表的顺序存储实现,核心操作需注意元素移动和边界条件,适合读多写少的场景,但插入/删除效率较低。