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 顺序表

  1. 基本操作
// 初始化
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;
}
  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 单链表

  1. 基本操作
// 数组 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;
}
  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章 线性表相关推荐

  1. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  2. 数据结构 严蔚敏 第二章 线性表

    数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...

  3. 【课上笔记】第二章 线性表

    第二章 线性表 2.1 线性表的逻辑结构 2.1.1线性表的定义 ​ 线性表是一种线性结构.线性结构的特点是数据元素之间是一种线性关系,数据元素"一个接一个的排列".在一个线性表中 ...

  4. 天勤考研数据结构笔记—栈的C语言实现

    栈的基本概念 栈的定义:栈是一种只能在一端进行插入或删除操作的线性表.其中允许进行插入或删除的一端称为栈顶(top).栈顶是由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是数组索引, ...

  5. 数据结构笔记(一) 线性表(C语言描述)

    数据结构(一) 线性表 顺序表 存储结构 #define ElemType int #define MAXSIZE 100 typedef struct{ElemType *elem;//初始地址in ...

  6. 《大话数据结构》第3章 线性表 3.8.2 单链表的删除

    3.8.2 单链表的删除         现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所 ...

  7. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  8. 《大话数据结构》| 第3章 线性表

    目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.4.1 顺序存储定义 3.4.2 顺序存储方式 3.4.3 数据长度与线性表长度的区别 3.4.4 地址计算 ...

  9. 考研数据结构笔记——第五章 树和二叉树

    文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储

最新文章

  1. 美国国家科学委员会发布学术研发报告
  2. Oracle导入导出dmp文件
  3. 2014.7.26-7.29日广大网友的提问解答(答问题的第1个工作周)
  4. C#定义属性-静态属性
  5. OPPO K9 Pro将于9月26日登场:搭载天玑1200旗舰游戏芯
  6. Oracle完全手册,Oracle_11g+Oracle Sqldeveloper 安装完全手册(for win 7 64x)
  7. python中的列表、字典、字符串
  8. Linux下MySQL表名区分大小写
  9. java数组的基本使用
  10. c语言宿舍管理系统程序,C语言——学生宿舍管理系统
  11. 人机大战!人工智能轻松打败美国空军
  12. python无限循环小数是有理数吗_证明:所有无限循环小数都是无理数
  13. android scroller,深入理解Android中Scroller的滚动原理
  14. linux_linux自动化换源等优化美化自动化操作脚本/oh my zsh安装/卸载与删除/vim/vi卸载与更新异常/linux发行版本/内核版本查看
  15. 多媒体——视频——利用视频视图VideoView播放视频
  16. TCP 与UDP 的区别
  17. unity----lua调用c#之lua调用c#中的数组,list,字典
  18. Day10-feign结合Hystrix使用-p163、p164
  19. Python pip 安装、使用与升级
  20. pppoe指定服务器ip,PPPoE服务器相关配置

热门文章

  1. 推荐系统算法(MF、FM、CF、SVD、LFM、SVD++、TItemCF、timeSVD++、模型融合)
  2. php小白到大牛,opencart 后台二次开发教学
  3. 如何申请邮箱号,正确选择好用的办公邮箱
  4. 什么是wired memory
  5. 国内PDM学习网站资源
  6. vim编辑器的工作模式
  7. scrapy爬虫之抓取京东机械键盘评论量并画图展示
  8. windows 主题壁纸更换
  9. iOS开发小结 - 使用自定义字体
  10. 全新营销时代,金融企业如何有“种”有“收”?