链表知识
来源:互联网 发布:淘宝焊接阀门 编辑:程序博客网 时间:2024/06/07 15:54
一、顺序表
类似数组
1.建立顺序表
void CreatList(SqList *&L,类型 a[],int n){ L = (SqList *)malloc(sizeof(SqList)); for(int i=1;i<=n;i++) { L->data[i] = a[i]; }}
2.顺序表的归并(思想与顺序表归并类似,见下面)
顺序表和数组思想一样,也可以用链表做
int UnionList(int A[],int B[]){ int i=1,j=1,k=0; while(i <= n && j <= m) { if(A[i] < B[j]) { C[k] = A[i]; k++; i++; } else { C[k] = B[j]; k++; j++; } } while(i <= n) { C[k] = A[i]; i++; k++; } while(j <= m) { C[k] = B[j]; j++; k++; } return k;}
二、单链表
需要结构体:
struct nod
{
类型 data;
struct node *next;
}
1.插入节点——头插法(逆序,与输入的顺序相反)
void CreateList(node *&L,类型 a[],int n){ struct node *p; L = (node *)malloc(sizeof(node)); L->next = NULL; for(int i=1;i<=n;i++) { p = (node *)malloc(sizeof(node)); p->data = a[i]; p->next = L->next; L->next = p; }}
2.插入节点——尾插法(正常顺序)
void CreateList(node *&L,类型 a[],int n){ struct node *p,*s; L = (node *)malloc(sizeof(node)); s = L; for(int i=1;i<=n;i++) { p = (node *)malloc(sizeof(node)); p->data = a[i]; s->next = p; s = p; } s->next = NULL;}
3.输出线性表
void DispList(node *L){ node *p; p = L->next; while(p!=NULL) { printf("%d",p->data); p = p->next; }}
4.删除节点(将链表中重复的元素删除)相同的只留一个
//删除线性表中相同的元素 p = L->next; while(p!= NULL) { q = p; r = q->next; while(r!=NULL) { if(p->data == r->data) //先保持一个元素不变(P),另一个后移(r,q). { q->next = r->next; //把 r 删掉 r = q->next; // r 重新赋值为q 的后继节点 n--; } else //若两个不相同,就后移。 { r = r->next; //r 后移 q = q->next; //q 后移一个 } } p = p->next; //都遍历完一次换下一个节点 }
5.删除线性表中数据为e的元素(不只有一个):
p = L;while(p->next!=NULL){ if(p->next->data == e ) { q = p->next; p->next = q->next; free(q); } else p = p->next; }
6.无序的链表转化成有序链表
void sort(node *&L){ struct node *p,*pre,*q; p = L->next->next; // p 指向L 的第二个数据点 L->next->next = NULL; //构造只含一个数据点的有序单链表 while(p!=NULL) { q = p->next; //q 存放p 节点的后继节点的指针 pre = L; //前一个元素与后一个元素相比,前< 后,则pre后移 while(pre->next !=NULL && pre->next->data < p->data) pre = pre->next; //否则: p->next = pre->next; pre->next = p; p = q; } //输出链表元素 p = L->next; while(p!=NULL) { printf("%d",p->data); if(p->next != NULL) printf(" "); p = p->next; }}
三、双链表
1.建立双向链表
struct nod
{
类型 data;
struct node *next;
struct node *prior;
}
头插法:
void CreateList(node *&L,类型 a[],int n){ struct node *p; L = (node *)malloc(sizeof(node)); L->next = L->prior = NULL; for(int i=1;i<=n;i++) { p = (node *)malloc(sizeof(node)); p->data = a[i]; p->next = L->next; if(L->next != NULL) L->next = L->prior = p; L->next = p; s->prior = L; }}
尾插法:
void CreateList(node *&L,类型 a[],int n){ struct node *p,*s; L = (node *)malloc(sizeof(node)); s = L; for(int i=1;i<=n;i++) { p = (node *)malloc(sizeof(node)); p->data = a[i]; s->next = p; p->prior = s; s = p; } s->next = NULL;}
2.输出某一元素的前驱与后继
for(int j=1;j<=m;j++) { //输入要查找前驱,后继的元素 scanf("%d",&e); p = L->next; //第一个元素的位置,首节点是第一个元素 p->prior = NULL; /*一开始做的时候第一个节点的前驱判断不了,因为第一个节点的前驱为 L ,不为空 前驱节点等于L 也不可以,所以直接把 p前驱节点设为空*/ while(p!=NULL) { if(p->data == e) { if(p->next != NULL && p->prior != NULL) printf("%d %d\n",p->prior->data,p->next->data); else if(p->next == NULL && p->prior != NULL) printf("%d\n",p->prior->data); else if(p->next != NULL && p->prior == NULL) printf("%d\n",p->next->data); } p = p->next; } }
四、循环链表
五、有序表
1.有序链表的归并
用三个顺序表,LA,LB,LC,其中LA,LB存放输入数据,LC存放LA,LB两者之间较小的那个。
void UnionList(node *LA,node *LB){ struct node *LC; struct node *pa = LA->next,*pb = LB->next,*r,*s; LC = (node *)malloc(sizeof(node)); r = LC; //将pa(LA),pb(LB)中较小的一个元素放入LC中 while(pa!=NULL && pb!=NULL) { if(pa->data < pb->data) { s = (node *)malloc(sizeof(node)); s->data = pa->data; r->next = s; r = s; pa = pa->next; } else { s = (node *)malloc(sizeof(node)); s->data = pb->data; r->next = s; r = s; pb = pb->next; } } //若LA比较长,则比较完后将剩下的元素直接放入LC中 while(pa!=NULL) { s = (node *)malloc(sizeof(node)); s->data = pa->data; r->next = s; r = s; pa = pa->next; } //同理若LB比较长,则比较完后将剩下的元素直接放入LC中 while(pb!=NULL) { s = (node *)malloc(sizeof(node)); s->data = pb->data; r->next = s; r = s; pb = pb->next; } r->next = NULL; s = LC->next; while(s!=NULL) { printf("%d ",s->data); s = s->next; }}
阅读全文
0 0
- 一点链表知识
- 链表知识
- 链表部分知识
- 链表知识
- 链表预备知识
- 链表知识
- 链表知识技巧
- 数据结构链表知识整合
- 链表的知识结构图
- 链表的相关知识
- 链表的简单知识
- 那些被遗忘的链表知识
- 个人总结的一些链表知识
- android知识回顾-----单向链表
- 区块链普及知识
- Java知识链整理
- 知识链-源码分析
- 知识链-Java集合
- http
- java深入学习七之封装与继承,多态
- Python can't find '__main__' module in ''
- 算法分析与设计——LeetCode Problem.2 Add Two Numbers
- 【跟着stackoverflow学Pandas】--Converting a Pandas GroupBy object to DataFrame-Groupby对象转换为DataFrame
- 链表知识
- 【可持久化并查集】BZOJ3674[可持久化并查集加强版]题解
- 多进程的实现
- SSH项目整合配置文件关联图
- 笔下生花系列之文笔提炼
- Java堆内存溢出
- 欢迎使用CSDN-markdown编辑器
- Oracle HANGANALYZE
- Spring基础(精通Spring+4.x++企业应用开发实战 第7章)