学习笔记------数据结构(C语言版) 扩展的线性单链表及归并
来源:互联网 发布:unity3d 点击物体 编辑:程序博客网 时间:2024/06/16 23:54
//Function realization.cpp
#include"predefined.h"#include"ExtenLinkedList.h"Status MakeNode_E(Link *p,ElemType e)//分配由p指向的值为e的结点,并返回OK;//若分配失败,则返回ERROE。{(*p)=(Link)malloc(sizeof(LNode));if(!(*p)) exit(OVERFLOW);(**p).data=e;(**p).next=NULL;return OK;}void FreeNode_E(Link *p)//释放p所指的结点。{free(*p);*p=NULL;}Status InitList_E(LinkList *L)//构造一个空的线性链表L。{Link p;p=(Link)malloc(sizeof(LNode));if(!p) exit(OVERFLOW);(*p).next=NULL;(*p).data=0;(*L).head=(*L).tail=p;(*L).len=0;return OK;}Status DestroyList_E(LinkList *L)//销毁线性链表L,L不再存在。{Link p,q; p=(*L).head; while(p) { q=p; p=(*p).next;free(q); }(*L).head=(*L).tail=NULL;(*L).len=0; return OK;}Status ClearList_E(LinkList *L)//将线性链表L重置为空表,并释放原链表的结点空间。{Link p,q;p=(*(*L).head).next;while(p){q=p;p=(*p).next;free(q);}(*(*L).head).next=NULL;(*L).len=0;(*L).tail=(*L).head;return OK;}Status InsFirst_E(LinkList *L,Link h,Link s)//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前。{(*s).next=(*h).next;(*h).next=s;(*L).len++;if((*L).tail==h) (*L).tail=s;return OK;}Status DelFirst_E(LinkList *L,Link h,Link *q)//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回。{if(!((*h).next)) return ERROR;if(!(*(*h).next).next) (*L).tail=(*L).head;*q=(*h).next;(*h).next=(*(*h).next).next;(*L).len--;return OK;}Status Append_E(LinkList *L,Link s)//将指针s所指(彼此以指针相连)的一串结点链接在线性表L的最后一个结点//之后,并改变链表L的尾指针指向新的尾结点。{Link p,q;int count=0;p=(*L).tail;(*p).next=s;while(s){q=s;s=(*s).next;count++;}(*L).tail=q;(*L).len+=count;return OK;}Status Remove_E(LinkList *L,Link *q)//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点。{Link p,r;p=(*L).head;if(p){while((*p).next){r=p;p=(*p).next;}(*r).next=NULL;*q=p;(*L).tail=r;(*L).len--;return OK;}*q=NULL;return FALSE;}Status InsBefore_E(LinkList *L,Link *p,Link s)//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,//并修改指针p指向新插入的结点。{if(!(*p)||(*L).head==*p||!(*L).head) return ERROR;Link q,r;q=(*L).head;while(!(q==*p)){r=q;q=(*q).next;if(!q) return ERROR;}(*s).next=*p;(*r).next=s;*p=s;(*L).len++;return OK;}Status InsAfter_E(LinkList *L,Link *p,Link s)//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,//并修改指针p指向新插入的结点。{if(!(*p)||!(*L).head) return ERROR;Link q;(*s).next=(**p).next;(**p).next=s;if(!(**p).next) (*L).tail=s;*p==s;(*L).len++;return OK;}Status SetCurElem_E(Link *p,ElemType e)//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值。{if(!(*p)) return ERROR;(**p).data=e;return OK;}ElemType GetCurElem_E(Link p)//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值。{ if(!p) return ERROR;return (*p).data;}Status ListEmpty_E(LinkList L)//若线性表L为空表,则返回TRUE,否则返回FALSE。{if(L.len==0) return TRUE;else return FALSE;}int ListLength_E(LinkList L)//返回线性链表L中元素的个数。{return L.len;}Position GetHead_E(LinkList L)//返回线性链表L中头结点的位置。{return L.head;}Position GetLast_E(LinkList L)//返回线性链表L中最后一个结点的位置。{return L.tail;}Position PriorPos_E(LinkList L,Link p)//已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置,//若无前驱,则返回NULL。{if((L.head==p)||(*L.head).next==p) return NULL;Link q,r;q=L.head;while(!(q==p)){r=q;q=(*q).next;if(!q) return NULL;}return r;}Position NextPos_E(LinkList L,Link p)//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置,//若无后继,则返回NULL。{return (*p).next;}Status LocatePos_E(LinkList L,int i,Link *p)//返回p指示线性链表L中第i个结点的位置并返回OK,i值不合法时返回ERROR。{*p=L.head;if(i<0||i>L.len) return ERROR;while(*p&&i>0){(*p)=(**p).next;i--;}return OK;}Position LocateElem_E(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))//返回链表L中第1个与e满足函数compare()判定关系的元素的位置,//若不存在这样的元素,则返回NULL。{Link p;p=(*(L).head).next;while(p&&!compare((*p).data,e))p=(*p).next;return p;}Status ListTraverse_E(LinkList L,Status(*visit)(ElemType))//依次对L中每个元素调用函数visit()。一旦visit()失败,则操作失败。{Link p;int i;p=(*(L).head).next;for(i=0;i<L.len;i++){visit((*p).data);p=(*p).next;}return OK;}Status ListInsert_L_E(LinkList *L,int i,ElemType e)//算法2.20:在带头结点的单链线性表L的第i个元素之前插入元素e{Link h,s;if(!LocatePos_E(*L,i-1,&h)) return ERROR;if(!MakeNode_E(&s,e)) return ERROR;InsFirst_E(L,h,s);return OK;}Status MergList_L_E(LinkList *La,LinkList *Lb,LinkList *Lc,int (*compare)(ElemType,ElemType))//算法2.21:已知单链线性表La和Lb的元素按值非递减排列。//归并La和La得到新的单链线性表Lc,Lc的元素也按值非递减排列。{Position ha,hb,pa,pb;ElemType a,b;Link q;if(!InitList_E(Lc)) return ERROR;ha=GetHead_E(*La);hb=GetHead_E(*Lb);pa=NextPos_E(*La,ha);pb=NextPos_E(*Lb,hb);while(pa&&pb){a=GetCurElem_E(pa);b=GetCurElem_E(pb);if(compare(a,b)<=0){DelFirst_E(La,ha,&q);InsFirst_E(Lc,(*Lc).tail,q);pa=NextPos_E(*La,ha);}else{DelFirst_E(Lb,hb,&q);InsFirst_E(Lc,(*Lc).tail,q);pb=NextPos_E(*Lb,hb);}}if(pa) Append_E(Lc,pa);else Append_E(Lc,pb);FreeNode_E(&ha);FreeNode_E(&hb);return OK;}
#include"predefined.h"#include"ExtenLinkedList.h"Status visit(ElemType e){printf("%d ",e);return OK;}Status CmpGreater(ElemType m,ElemType n){if(m>n) return TRUE;else return FALSE;}int main(){LinkList La,Lb,Lc;Status s;int n,m,i;Link p,q,ss;ElemType e;printf("Function 1\n★函数InitList_E(LinkList *L)测试...\n");s=InitList_E(&La);printf("▲初始化扩展的单链表La: %d (0:失败 1:成功)\n\n",s);printf("Function 2\n★函数ListEmpty_E(LinkList L)测试...\n");s=ListEmpty_E(La);printf("▲表La是否为空表: %d (0:否 1:是)\n\n",s);printf("Function 3\n★函数ListInsert_L_E(LinkList *L,int i,ElemType e)测试...\n");printf("▲请输入准备向La输入的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("▲请输入La第%d个数:",i); scanf("%d",&m); s=ListInsert_L_E(&La,i,m); printf("▲插入成功?:%d (1:成功 0:失败)\n",s); } printf("\n");printf("Function 4\n★函数ListTraverse_E(LinkList L,Status(*visit)(ElemType))测试...\n");printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n"); printf("Function 5\n★函数ListLength_E(LinkList L)测试...\n");s=ListLength_E(La);printf("▲La的长度为:%d\n\n",s);printf("Function 6\n★函数LocatePos_E(LinkList L,int i,Link *p)测试...\n");LocatePos_E(La,3,&p);printf("▲表La第3个元素\"%d\"的地址为:0x%x\n\n",(*p).data,p);printf("Function 7\n★函数PriorPos_E(LinkList L,Link p)测试...\n");q=PriorPos_E(La,p);printf("▲指针p指向的元素\"%d\"的前驱元素为\"%d\"\n\n",(*p).data,(*q).data);printf("Function 8\n★函数NextPos_E(LinkList L,Link p)测试...\n");q=NextPos_E(La,p);printf("▲指针p指向的元素\"%d\"的后继元素为\"%d\"\n\n",(*p).data,(*q).data);printf("Function 9\n★函数LocateElem_E(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))测试...\n");p=LocateElem_E(La,3,CmpGreater);printf("▲表La中第一个大于3的元素\"%d\"的地址为:0x%x\n\n",(*p).data,p);printf("Function 10\n★函数MakeNode_E(Link *p,ElemType e)测试...\n");printf("▲创建结点p...\n");MakeNode_E(&p,111);printf("▲创建结点q...\n\n");MakeNode_E(&q,222);printf("Function 11\n★函数GetCurElem_E(Link p)测试...\n");e=GetCurElem_E(p);printf("▲结点p的值:%d\n",e);e=GetCurElem_E(q);printf("▲结点q的值:%d\n\n",e);printf("Function 12\n★函数SetCurElem_E(Link *p,ElemType e)测试...\n");printf("▲用666替换p结点中的值...\n");SetCurElem_E(&p,666);e=GetCurElem_E(p);printf("▲结点p的值:%d\n\n",e);printf("Function 13\n★函数FreeNode_E(Link *p)测试...\n");printf("▲销毁p结点前:");p?printf("p存 在!!!\n"):printf("p不存在!!!\n");FreeNode_E(&p);printf("▲销毁p结点后:");p?printf("p存 在!!!\n\n"):printf("p不存在!!!\n\n");printf("Function 14\n★函数Append_E(LinkList *L,Link s)测试...\n");printf("▲将q结点插在La最后一个结点之后...\n");Append_E(&La,q);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 15\n★函数Remove_E(LinkList *L,Link *q)测试...\n");printf("▲删除L中最后一个结点,用p接受最后一个结点...\n");Remove_E(&La,&p);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 16\n★函数InsFirst_E(LinkList *L,Link h,Link s)测试...\n");printf("▲创建值为888的结点p...\n");MakeNode_E(&p,888);printf("▲令q指向La中第3个元素...\n");LocatePos_E(La,3,&q);printf("▲将p结点插入到以q作为头结点的链表第一个结点之前...\n");InsFirst_E(&La,q,p);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 17\n★函数DelFirst_E(LinkList *L,Link h,Link *q)测试...\n");printf("▲删除La中以第3个结点q为头结点的链表的第一个结点...\n");DelFirst_E(&La,q,&p);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 18\n★函数GetHead_E(LinkList L)测试...\n");p=GetHead_E(La);printf("▲La的头指针p=La.head=0x%x\n\n",p); printf("Function 19\n★函数GetLast_E(LinkList L)测试...\n");q=GetLast_E(La);printf("▲La的尾指针q=La.tail=0x%x\n\n",q);printf("Function 20\n★函数InsBefore_E(LinkList *L,Link *p,Link s)测试...\n");printf("▲创建值为999的结点ss...\n");MakeNode_E(&ss,999);printf("▲将结点ss插入到尾结点q之前...\n");InsBefore_E(&La,&q,ss);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 21\n★函数InsAfter_E(LinkList *L,Link *p,Link s)测试...\n");printf("▲创建值为777的结点ss...\n");MakeNode_E(&ss,777);printf("▲将结点ss插入到头结点p之后...\n");InsAfter_E(&La,&p,ss);printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");printf("Function 22\n★函数ClearList_E(LinkList *L)测试...\n");printf("▲置空前:");ListEmpty_E(La)?printf("La为空!!!\n"):printf("La非空!!!\n");ClearList_E(&La);printf("▲置空后:");ListEmpty_E(La)?printf("La为空!!!\n\n"):printf("La非空!!!\n\n");printf("Function 22\n★函数DestroyList_E(LinkList *L)测试...\n");printf("▲销毁前:");(La.head!=NULL&&La.tail!=NULL)?printf("La存 在!!!\n"):printf("La不存在!!!\n");DestroyList_E(&La);printf("▲销毁后:");(La.head!=NULL&&La.tail!=NULL)?printf("La存 在!!!\n\n"):printf("La不存在!!!\n\n");printf("Function 23\n★函数MergList_L_E(LinkList *La,LinkList *Lb,LinkList *Lc,int (*compare)(ElemType,ElemType))测试...\n");s=InitList_E(&La);printf("▲初始化扩展的单链表La: %d (0:失败 1:成功)\n\n",s);s=InitList_E(&Lb);printf("▲初始化扩展的单链表Lb: %d (0:失败 1:成功)\n\n",s);printf("▲请输入准备向La输入的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("▲请输入La第%d个数:",i); scanf("%d",&m); s=ListInsert_L_E(&La,i,m); printf("▲插入成功?:%d (1:成功 0:失败)\n",s); } printf("\n");printf("▲La中的元素为:La={"); ListTraverse_E(La,visit); printf("}\n\n");//printf("▲请输入准备向Lb输入的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("▲请输入Lb第%d个数:",i); scanf("%d",&m); s=ListInsert_L_E(&Lb,i,m); printf("▲插入成功?:%d (1:成功 0:失败)\n",s); } printf("\n");printf("▲Lb中的元素为:Lb={"); ListTraverse_E(Lb,visit); printf("}\n\n");MergList_L_E(&La,&Lb,&Lc,CmpGreater);printf("▲Lc中的元素为:Lc={"); ListTraverse_E(Lc,visit); printf("}\n\n");}
//ExtenLinkedList.h
typedef struct LNode//结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct//链表类型{Link head,tail;int len;}LinkList;Status MakeNode_E(Link *p,ElemType e);void FreeNode_E(Link *p);Status InitList_E(LinkList *L);Status DestroyList_E(LinkList *L);Status ClearList_E(LinkList *L);Status InsFirst_E(LinkList *L,Link h,Link s);Status DelFirst_E(LinkList *L,Link h,Link *q);Status Append_E(LinkList *L,Link s);Status Remove_E(LinkList *L,Link *q);Status InsBefore_E(LinkList *L,Link *p,Link s);Status InsAfter_E(LinkList *L,Link *p,Link s);Status SetCurElem_E(Link *p,ElemType e);ElemType GetCurElem_E(Link p);Status ListEmpty_E(LinkList L);int ListLength_E(LinkList L);Position GetHead_E(LinkList L);Position GetLast_E(LinkList L);Position PriorPos_E(LinkList L,Link p);Position NextPos_E(LinkList L,Link p);Status LocatePos_E(LinkList L,int i,Link *p);Position LocateElem_E(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType));Status ListTraverse_E(LinkList L,Status(*visit)(ElemType));Status ListInsert_L_E(LinkList *L,int i,ElemType e);Status MergList_L_E(LinkList *La,LinkList *Lb,LinkList *Lc,int (*compare)(ElemType,ElemType));Status visit(ElemType e);Status CmpGreater(ElemType m,ElemType n);
//predefined.h
#include "stdio.h"#include "stdlib.h"#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;
0 0
- 学习笔记------数据结构(C语言版) 扩展的线性单链表及归并
- 数据结构(C语言版)线性表学习笔记
- 学习笔记------数据结构(C语言版) 线性表顺序存储
- 学习笔记------数据结构(C语言版) 线性表链式存储
- c语言版数据结构之线性表归并大概
- 数据结构(c语言版) 学习笔记
- 学习笔记------数据结构(C语言版)栈的顺序存储
- 学习笔记------数据结构(C语言版) 串的模式匹配
- 学习笔记------数据结构(C语言版)数组的顺序存储
- 《数据结构(C语言版)》- 线性表
- 严蔚敏--数据结构(C语言版)学习笔记
- 数据结构(C语言版)-递归学习笔记
- 2-10-归并扩展的线性单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构之对线性表的操作(C语言版)
- 【C语言版数据结构】线性表的单链表有关的相关操作
- 数据结构C语言版之线性表
- 数据结构之线性表(C语言版)
- 线性表的链式存储及相关操作 C语言版
- adbl连接不上 daemon not running. starting it now on port 5037 ADB server didn't ACK
- poj3164Command Network
- 好的博客
- brew install mysql
- export与source 一个shell脚本文件的关系
- 学习笔记------数据结构(C语言版) 扩展的线性单链表及归并
- 源码分析异步消息处理线程机制(Looper MessageQueue Handler Message)
- Android EventBus在Fragment中不起作用的解决方法
- iOS 【Multithreading-创建线程的方式/线程状态(了解)】
- poj2063Investment【完全背包】
- oracle 树状查询
- 关于android内存泄露那点事
- OC-1面试题
- IOS开发-几种截屏方法