学习笔记------数据结构(C语言版) 线性表链式存储
2016-01-08 21:27
441 查看
//Function realization.cpp
//main.cpp
//lianshijiegou.h
//predefined.h
注意:二极指针的使用, scanf("%d",&a)。
#include "predefined.h" #include"lianshijiegou.h" //----线性表的动态分配链式存储结构函数实现--------- Status InitList_L(LinkList *L)//构造一个带头结点的空线性表 { (*L)=(LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); (**L).next=NULL; (**L).data=0; return OK; } Status DestroyList_L(LinkList *L)//销毁线性表 { LinkList p,q; p=*L; while(p) { p=(**L).next; free(*L); (*L)=p; } return OK; } Status ClearList_L(LinkList *L)//重置线性表为空表,保留头结点 { LinkList p,q; p=*L; if(!p) return FALSE; p=(*p).next; while(!p) { q=p; p=(*p).next; free(q); } (**L).next=NULL; return OK; } Status ListEmpty_L(LinkList L)//若为空表,返回TRUE,否则返回FALSE { if(!((*L).next)&&L!=NULL) return TRUE; else return FALSE; } Status ListLength_L(LinkList L)//返回表中数据个数 { ElemType n=0; LinkList p; p=L; while(p=(*p).next) n++; return n; } Status GetElem_L(LinkList L,int i,ElemType *e)//L为带头结点的单链表的头指针。 //算法2.8:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。 { LinkList p; int j=1; p=(*L).next; while(p&&j<i) { p=(*p).next; ++j; } if(!p||j>i) return ERROR; *e=(*p).data; return OK; } Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e)) //返回L中第一个与e满足关系compare数据元素的位序。若这样的数据元素不存在,则返回0。 { LinkList p; p=(*L).next; Status n; n=compare(p,e); if(n) return n; else return FALSE; } Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e) //若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败 { LinkList p=(*L).next; Status n; n=LocateElem_L(L,cur_e,equal); if(n==1||n==0) return FALSE; for(int i=2;i<n;i++) { p=(*p).next; } *pre_e=(*p).data; return OK; } Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e) //若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败 { LinkList p=(*L).next; while((*p).next!=NULL) { if((*p).data==cur_e) { *next_e=(*(*p).next).data; return OK; } else p=(*p).next; } return FALSE; } Status ListInsert_L(LinkList *L,int i,ElemType e) //算法2.9:在带头结点的单链表L中第i个位置之前插入元素e。 { LinkList p,q; p=*L; if(i<1||i>ListLength_L(*L)+1) return FALSE; for(int j=1;j<i;j++) { p=(*p).next; } q=(LinkList)malloc(sizeof(LNode)); (*q).data=e; (*q).next=(*p).next; (*p).next=q; return OK; } Status ListDelete_L(LinkList *L,int i,ElemType *e) //算法2.10:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。 { LinkList p,q; p=*L; for(int j=1;j<i;j++) { p=(*p).next; } *e=(*(*p).next).data; q=(*p).next; (*p).next=(*(*p).next).next; free(q); return OK; } Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L)) //依次对L中每个元素调用visit函数。 { LinkList p; Status m; p=(*L).next; while(p!=NULL) { m=visit(p); if(m) p=(*p).next; else return FALSE; } return OK; } void CreatList_L(LinkList *L,int n) //算法2.11逆位序输入n个元素的值,建立带头结点的单链表L。 { (*L)=(LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); (**L).next=NULL; (**L).data=0; LinkList p; for(int i=n;i>0;--i) { p=(LinkList)malloc(sizeof(LNode)); printf("▼请输入第%d个数: ",i); scanf("%d",&(*p).data); (*p).next=(**L).next; (**L).next=p; } }
//main.cpp
#include "predefined.h" #include"lianshijiegou.h" Status equal(LinkList L,ElemType e) { int i; for(i=1;;i++) { if((*L).data==e) return i; else if((*L).next==NULL) return 0; else L=(*L).next; } } Status visit(LinkList L) { printf("%d ",(*L).data); return OK; } int main() { LinkList La,Lb,Lc; Status s; int n,m,i; ElemType e; printf("Function 1\n★函数 InitList_L(LinkList *L)测试...\n"); s=InitList_L(&La); printf("▲初始化单链表La: %d (0:失败 1:成功)\n\n",s); printf("Function 2\n★函数 ListEmpty_L(LinkList L)测试...\n"); s=ListEmpty_L(La); printf("▲表La是否为空表: %d (0:否 1:是)\n\n",s); printf("Function 3\n★函数 ListInsert_L(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(&La,i,m); printf("▲插入成功?:%d (1:成功 0:失败)\n",s); } printf("\n"); printf("Function 4\n★函数 ListTraverse_L(LinkList L,Status (*visit)(LinkList L))测试...\n"); printf("▲La中的元素为:La={"); ListTraverse_L(La,visit); printf("}\n\n"); printf("Function 5\n★函数 ListLength_L(LinkList L)测试...\n"); s=ListLength_L(La); printf("▲La的长度为:%d\n\n",s); printf("Function 6\n★函数 ListDelete_L(LinkList *L,int i,ElemType *e)测试...\n"); ListDelete_L(&La,3,&e); printf("▲删除La中第3个元素:\"%d\"\n",e); printf("▲La中的元素为:La={"); ListTraverse_L(La,visit); printf("}\n\n"); printf("Function 7\n★函数 GetElem_L(LinkList L,int i,ElemType *e)测试...\n"); GetElem_L(La,3,&e); printf("▲La中第三个位置元素为 \"%d\"\n\n",e); printf("Function 8\n★函数 LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))测试...\n"); s=LocateElem_L(La,6,equal); printf("▲La中第一个等于元素\"6\"的位置为 %d\n\n",s); printf("Function 9\n★函数 PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)测试...\n"); PriorElem_L(La,5,&e); printf("▲La中元素\"5\"的前驱为 %d\n\n",e); printf("Function 10\n★函数 NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)测试...\n"); NextElem_L(La,5,&e); printf("▲La中元素\"5\"的后继为 %d\n\n",e); printf("Function 11\n★函数 CreatList_L(LinkList *L,int n)测试...\n"); printf("▲请输入准备向Lb输入的个数:"); scanf("%d",&n); CreatList_L(&Lb,n); printf("▲Lb中的元素为:Lb={"); ListTraverse_L(Lb,visit); printf("}\n\n"); printf("Function 12\n★函数 MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)测试...\n"); MergeList(&La,&Lb,&Lc); printf("▲Lc中的元素为:Lc={"); ListTraverse_L(Lc,visit); printf("}\n\n"); printf("Function 13\n★函数 ClearList_L(LinkList *L)测试...\n"); printf("▲Lc清空前 :"); ListEmpty_L(Lc)?printf("表Lc为空!!!\n"):printf("表Lc非空!!!\n"); ClearList_L(&Lc); printf("▲Lc清空后 :"); ListEmpty_L(Lc)?printf("表Lc为空!!!\n\n"):printf("表Lc非空!!!\n\n"); printf("Function 14\n★函数 DestroyList_L(LinkList *L)测试...\n"); printf("▲Lc销毁前 :"); Lc?printf("表Lc存 在!!!\n"):printf("表Lc不存在!!!\n"); DestroyList_L(&Lc); printf("▲Lc销毁后 :"); Lc?printf("表Lc存 在!!!\n\n"):printf("表Lc不存在!!!\n\n"); } void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc) //算法2.12:已知线性表La和Lb中的数据元素按值非递减排列。 //归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。 { LinkList pa,pb,pc; pa=(**La).next; //指向表a第一个元素 pb=(*Lb)->next; *Lc=pc=*La; //用La的头结点作为Lc的头结点 int i=1; while(pa&&pb) { if((*pa).data<=(*pb).data) { (*pc).next=pa; pc=(*pc).next; pa=(*pa).next; } else { (*pc).next=pb; pc=(*pc).next; pb=(*pb).next; } } (*pc).next=pa?pa:pb; free(*Lb); }
//lianshijiegou.h
typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; Status InitList_L(LinkList *L); Status DestroyList_L(LinkList *L); Status ClearList_L(LinkList *L); Status ListEmpty_L(LinkList L); Status ListLength_L(LinkList L); Status GetElem_L(LinkList L,int i,ElemType *e); Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e)); Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e); Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e); Status ListInsert_L(LinkList *L,int i,ElemType e); Status ListDelete_L(LinkList *L,int i,ElemType *e); Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L)); void CreatList_L(LinkList *L,int n); Status equal(LinkList L,ElemType e); Status visit(LinkList L); void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc);
//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 -2 typedef int Status; typedef int ElemType;
注意:二极指针的使用, scanf("%d",&a)。
相关文章推荐
- Ext2文件系统分区数据结构
- 数据结构,栈,括号配对
- 11 是否存在子树 & 二叉树镜像
- 【数据结构SPLAY】splay区间翻转,区间和查询,区间插入,区间删除,区间修改
- 10 归并两个有序链表
- java 中的JDK封装的数据结构和算法解析(集合类)----顺序表 List 之 ArrayList
- 数据结构:树、二叉树、二叉查找树
- 3-5-表达式求值-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
- C语言数据结构——单链表
- 无向图的邻接多重表结构,存储结构及基本功能实现(最全)
- c++ 数据结构 *** 栈的应用——计算器
- 数据结构之各种数据结构插入、删除、查找的时间复杂度
- 数据结构 2-11设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
- 数据结构之多维数组理解
- Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
- Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
- 算法导论7:选择算法和数据结构准备 2016.1.7
- C语言数据结构——顺序表
- ArrayList和LinkedList
- 数据结构--排序-查询-二叉树各种遍历-求深度