2022天勤考研数据结构笔记 第2章 线性表
2022天勤考研数据结构笔记 第2章 线性表(更新中)
- 第2章 线性表
- 2.1 结构体定义
- 2.2 顺序表
- 2.3 单链表
- 2.4 双链表
- 2.5 循环链表
- 2.6 逆置问题(408重要考点)
第2章 线性表
线性表是具有相同特性数据元素的一个有限序列,其可以是一个空表。可以是有序的,也可以是无序的。
2.1 结构体定义
// 定义一个整形常量
# define maxSize 100// 顺序表结构体定义
// 第一种表示
typedef struct{int data[maxSize];int length;
}Sqlist;
// 更为常见的表示
int A[maxSize];
int n;// 单链表结点定义
typedef struct LNode{int data;struct LNode* next;
}LNode;// 双链表结点定义
typedef struct DLNode{int data;struct LNode* prior;struct LNode* next;
}DLNode;
2.2 顺序表
- 基本操作
// 初始化
void initElem(Sqlist& L){L.length = 0;
}// 求指定位置 p 的元素
int initElem(Sqlist L, int p, int& e){if(p < 0 || p > L.length - 1)return 0;e = L.data[p];return 1;
}// 查找第一个值等于 e 的元素
int findElem(Sqlist L, int e){for(int i = 0; i < L.length; i++){if(e == L.data[i]) return i;}return -1;
}// p 位置插入元素 e
int insertElem(Sqlist& L, int p, int e){if(p < 0 || p > L.length || L.length == maxSize)for(int i = L.length-1; i >= p; i--){L.data[i+1] = L.data[i];}L.data[p] = e;L.length++;return 1;
}// 删除下标为 p 的元素
int deleteElem(Sqlist& L, int p, int& e){if(p < 0 || p > L.length - 1) return 0;e = L.data[p];for(int i = p; i < L.length - 1; i++){L.data[i] = L.data[i+1];}L.length--;return 1;
}
- 例子
// 已知一个递增有序排列的顺序表,设计一个算法,使插入元素 x 后该顺序表仍然递增有序排列
// 返回第一个比 x 元素大的元素位置
int findElem(Sqlist& L, int x){for(int i = 0; i < L.length; i++){if(L.data[i] > x){return i; }}return i; // 若不存在此元素, 则 i 正好标记表尾位置
}
// 插入 x 元素
void insertElem(Sqlist& L, int x){int p;p = findElem(L, x);for(int i = L.length - 1; i >= p; i--){L.data[i+1] = L.data[i];}L.data[p] = x;L.length++;
}
2.3 单链表
- 基本操作
// 数组 a 中存储 n 个元素,建立链表 C
// 头插法
void createListF(LNode*& C, int a[], int n){LNode* s;C = (LNode *)malloc(sizeof(LNode));C -> next = NULL;for(int i = 0; i < n; i++){s = (LNode *)malloc(sizeof(LNode));s -> data = a[i];s -> next = C -> next;C -> next = s;}
}
// 尾插法
void createListR(LNode*& C, int a[], int n){LNode* s, * r;C = (LNode *)malloc(sizeof(LNode));C -> next = NULL;r = C;for(int i = 0; i < n; i++){s = (LNode *)malloc(sizeof(LNode));s -> data = a[i];r -> next = s; r = s;}r -> next = NULL;
}//删除 p 位置的结点
int deleteList(LNode*& C, int p, int& e){if(p < 1 || p > L.length) return 0;LNode* s = C;for(int i = 0; i < p - 1; i++){s = s -> next; //找到第 p-1个结点}if(s == NULL || s -> next == NULL) return 0;LNode* r = s -> next;e = r -> data;s -> next = r -> next;free(r);return 1;
}//删除值为 x 的结点
int findAndDelete(LNode*& C, int x){LNode* p, * q;p = C;while(p -> next != NULL){if(p -> next -> data == x){break;}p = p -> next;}if(p -> next == NULL) return 0;q = p -> next;p -> next = q -> next;free(q);return 1;
}
- 例子
// A 和 B 是两个带头结点的单链表,元素递增有序
// 将 A 和 B 归并成一个按元素值 非递减 有序的链表 C
// 尾插法
void merge(LNode* A, LNode* B, LNode*& C){LNode *p = A -> next;LNode *q = B -> next;C = A;C -> next = NULL;free(B);LNode *s = C;while(p && q){if(p -> data <= q -> data){s -> next = p -> next;p = p -> next;}else{s -> next = q -> next; q = q -> next;}s = s -> next; }if(p){s -> next = p;}if(q){s -> next = q;}
}// 设计一个算法,将 A 和 B 归并成一个按元素值 递减 有序的链表 C
// 头插法
void merge(LNode* A, LNode* B, LNode*& C){LNode *p = A -> next;LNode *q = B -> next;LNode *s;C = A;C -> next = NULL;free(B);while(p && q){if(p -> data <= q -> data){s = p;p = p -> next;s -> next = C -> next;C -> next = s;}else{s = q;q = q -> next;s -> next = C -> next;C -> next = s;}}while(p){s = p;p = p -> next;s -> next = C -> next;C -> next = s;}if(q){s = q;q = q -> next;s -> next = C -> next;C -> next = s;}
}
2.4 双链表
基本操作
// 尾插法建立双链表
void createDListR(DLNode*& L, int a[], int n){DLNode* s, * r;L =(DLNode *)malloc(sizeof(DLNode));L -> next = NULL;L -> prior = NULL;r = L;for(int i = 0; i < n; i++){s =(DLNode *)malloc(sizeof(DLNode));s -> data = a[i];r -> next = s;s -> prior = r;r = r -> next;}r -> next = NULL;
}//查找第一个值为 x 的结点
DLNode* findNode(DLNode* C; int x){DLNode* p = C;while(p){if(p -> data == x) break;p = p -> next;}return p; //包含未找到时 p = NULL 的情况
}//在 p 后插入 s
int insertDLNode(DLNode* p, DLNode* s){if(!p || !s) return 0;s -> next = p -> next;s -> prior = p;p -> next = s;if(p -> next){s -> next -> prior = s;}return 0;
}//删除 p 的后继结点
int deleteDLNode(DLNode* p){if(!p || p -> next == NULL) return 0;DLNode* q = p -> next;p -> next = q -> next;if(q -> next){q -> next -> prior = p;}free(q);return 1;
}
2.5 循环链表
// p 为表尾结点的条件p -> next == head;
2.6 逆置问题(408重要考点)
// 逆置线性表中的元素
for(int i = left,j = right; i < j; i++, j--){int temp = 0;temp = a[i];a[i] = a[j];a[j] = temp;
}// 将长度为 n 的数组前端 k(k < n) 个元素逆序后移动到数组后端,其余元素位置无关紧要
void reverse(int a[], int left, int right, int k){int temp = 0;for(int i = left, j = right; i < j; i++, j--){temp = a[i];a[i] = a[j];a[j] = temp;}
}// 将长度为 n 的数组前端 k(k < n) 个元素保持原序移动到数组后端,其余元素位置无关紧要
void moveToEnd(int a[], int left, int right, int k){reverse(a, 0, k-1, k);reverse(a, 0, n-1, k);
}// 将数组中的元素循环左移 p(0 < p < n) 个位置
void moveP(int a[], int left, int right, int k){reverse(a, 0, p - 1, p);reverse(a, p, n - 1, n - p);reverse(a, 0, n - 1, n);
}
2022天勤考研数据结构笔记 第2章 线性表相关推荐
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- 数据结构 严蔚敏 第二章 线性表
数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...
- 【课上笔记】第二章 线性表
第二章 线性表 2.1 线性表的逻辑结构 2.1.1线性表的定义 线性表是一种线性结构.线性结构的特点是数据元素之间是一种线性关系,数据元素"一个接一个的排列".在一个线性表中 ...
- 天勤考研数据结构笔记—栈的C语言实现
栈的基本概念 栈的定义:栈是一种只能在一端进行插入或删除操作的线性表.其中允许进行插入或删除的一端称为栈顶(top).栈顶是由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是数组索引, ...
- 数据结构笔记(一) 线性表(C语言描述)
数据结构(一) 线性表 顺序表 存储结构 #define ElemType int #define MAXSIZE 100 typedef struct{ElemType *elem;//初始地址in ...
- 《大话数据结构》第3章 线性表 3.8.2 单链表的删除
3.8.2 单链表的删除 现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所 ...
- 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查
03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...
- 《大话数据结构》| 第3章 线性表
目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.4.1 顺序存储定义 3.4.2 顺序存储方式 3.4.3 数据长度与线性表长度的区别 3.4.4 地址计算 ...
- 考研数据结构笔记——第五章 树和二叉树
文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储
最新文章
- 美国国家科学委员会发布学术研发报告
- Oracle导入导出dmp文件
- 2014.7.26-7.29日广大网友的提问解答(答问题的第1个工作周)
- C#定义属性-静态属性
- OPPO K9 Pro将于9月26日登场:搭载天玑1200旗舰游戏芯
- Oracle完全手册,Oracle_11g+Oracle Sqldeveloper 安装完全手册(for win 7 64x)
- python中的列表、字典、字符串
- Linux下MySQL表名区分大小写
- java数组的基本使用
- c语言宿舍管理系统程序,C语言——学生宿舍管理系统
- 人机大战!人工智能轻松打败美国空军
- python无限循环小数是有理数吗_证明:所有无限循环小数都是无理数
- android scroller,深入理解Android中Scroller的滚动原理
- linux_linux自动化换源等优化美化自动化操作脚本/oh my zsh安装/卸载与删除/vim/vi卸载与更新异常/linux发行版本/内核版本查看
- 多媒体——视频——利用视频视图VideoView播放视频
- TCP 与UDP 的区别
- unity----lua调用c#之lua调用c#中的数组,list,字典
- Day10-feign结合Hystrix使用-p163、p164
- Python pip 安装、使用与升级
- pppoe指定服务器ip,PPPoE服务器相关配置