第二章 线性表(链表的建立与合并)
2017-10-20 22:59
197 查看
1.利用头插法和尾插法建立单链表
1.1利用尾插法建立单链表
typedef struct NODE//定义了一个结点 { int data;//数据域 struct NODE * next ;//指针域 }NODE,*PNODE; void createListT(PNODE &L,int a[], int n) {//创建一个链表,在表尾插入 int i = 0;//计时器的初值为0; PNODE pEnd;//创建一个指针时刻指向链表中的最后一个结点 L = (PNODE)malloc(sizeof(NODE));//创建了一个头结点,并使L指向了头结点 if(L==NULL) { printf("结点动态分配失败!!!\n"); exit(-1); } L->next = NULL; pEnd = L;//使pL指向头结点 while(i<n) { PNODE pnew = (PNODE)malloc(sizeof(NODE));//新建一个插入结点 pnew->data = a[i++];//把数组中的值赋给新的结点的数据域 pnew->next = pEnd->next; pEnd->next = pnew;//把新的结点插入在表尾 pEnd = pEnd->next;//pEnd指向当前链表的最后一个结点 } }
1.2利用尾插法建立单链表
void createListH(PNODE &L, int a[], int n) {//创建一个链表在表头插入 int i = 0;//计时器的初值为0; L = (PNODE)malloc(sizeof(NODE));//创建一个头结点并使L指向头结点 if(L == NULL) { printf("头结点内存分配失败!!!\n"); exit(-1); } L->next = NULL; while(i<n) { PNODE pnew = (PNODE)malloc(sizeof(NODE));//创建一个插入结点,并使pnew指向插入节点 pnew->data = a[i++]; pnew->next = L->next;//让插入结点的指针域指向头结点的指针域 L->next = pnew;//让头结点的指针域指向插入的结点,即插入的结点插在表头; } }
2.链表的合并
2.1链表的合并(尾插法)
把两个非递减的链表合成,合成后的链表也是非递减的void MergeListT(PNODE La,PNODE &Lb,PNODE &Lc) {//两个非递减的链表的合并,合并后链表还是非递减的 PNODE pa,pb,pc; pa = La->next;//pa指向La的第一个结点 pb = Lb->next;//pb指向Lb的第一个结点 free(Lb);//把Lb的头结点释放掉 Lb = NULL;//Lb指向空 Lc = La;//Lc利用La的头结点 Lc->next = NULL; pc = Lc;//pc指向Lc头结点 while (pa != NULL && pb != NULL)//循环结束后必有一个链表的元素全部插入到LC中 { if(pa->data <= pb->data) { pc->next = pa;//把pa指向的结点链接在Lc中 pa = pa->next;//pa指向下一个结点 pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点 // Link(pc,pa); } else //否则的话将pb指向的结点连接在LC中 { pc->next = pb; pb = pb->next; pc = pc->next; //Link(pc,pb); } }
由于下面这段代码的重复性过高,所以可以封装为一个函数
pc->next = pa;//把pa指向的结点链接在Lc中
pa = pa->next;//pa指向下一个结点
pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点
void LinkT(PNODE &pc,PNODE &pw) { pc->next = pw;//把pa指向的结点链接在Lc中 pw = pw->next;//pa指向下一个结点 pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点 }
2.2链表的合并(头插法)
void MergeListH(PNODE La,PNODE &Lb,PNODE &Lc) {//两个非递减的链表的合并,合并后链表是递减的 PNODE pa,pb,pt; pa = La->next;//pa指向La的第一个结点 pb = Lb->next;//pb指向Lb的第一个结点 free(Lb);//把Lb的头结点释放掉 Lb = NULL;//Lb指向空 4000 Lc = La;//Lc利用La的头结点 Lc->next = NULL; while (pa != NULL && pb != NULL)//循环结束后必有一个链表的元素全部插入到LC中 { if(pa->data <= pb->data) { // pt = pa; //利用pt保存要插入的结点,然后pa指向下一个结点,如果不保存直接插入的话,就会丢失pa后面的结点 // pa = pa->next; // pt->next = Lc->next; // Lc->next = pt; LinkH(Lc,pa); } else //否则的话将pb指向的结点连接在LC中 { // pt = pb; // pb = pb->next; // pt->next = Lc->next; // Lc->next = pt; LinkH(Lc,pb); } } while(pa != NULL) { // pt = pa; // pa = pa->next; // pt->next = Lc->next; // Lc->next = pt; LinkH(Lc,pa); } while(pb != NULL) { // pt = pb; // pb = pb->next; // pt->next = Lc->next; // Lc->next = pt; LinkH(Lc,pb); } }
由于下面这段代码的重复性过高,所以可以封装为一个函数
// pt = pa;
// pa = pa->next;
// pt->next = Lc->next;
// Lc->next = pt;
void LinkH(PNODE &Lc,PNODE &pw) { PNODE pt = pw; pw = pw->next; pt->next = Lc->next; Lc->next = pt; }
相关文章推荐
- 《数据结构》严蔚敏版(java解)——第二章 线性表04 顺序单链表合并
- 寒假第二天--线性表--数据结构实验之链表一:顺序建立链表
- 数据结构编程笔记四:第二章 线性表 单链表的实现
- 数据结构 线性表 建立循环链表
- 【数据结构】-线性表-链表 熟练度max=3(不建立新节点,使链表L倒序)
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 数据结构之 线性表---有序链表的建立
- 链表面试题之合并有序的两个线性表-递归和非递归的方法
- 数据结构编程笔记六:第二章 线性表 双向循环链表的实现
- 【学习点滴-数据结构-单链表】单链表的建立,遍历及有序单链表合并
- c++实现双向链表的建立,插入,删除,合并,打印
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- <数据结构> 第二章 线性表之循环链表的代码粗实现
- C/C++ 第四周线性表(二)--链表 项目一 建立单链表
- 数据结构之循环链表操作3-(合并,拆分,插入,删除,建立等)
- 利用线性链表基本操作完成两个有序线性表的合并
- c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表
- 寒假第二天--线性表-- 数据结构实验之链表六:有序链表的建立
- 第四周线性表(二)--链表 项目一 建立单链表
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)