最完整的线性表应用 经测试可直接运行
有很多文章内容很丰富,但阅读的人很少,其之所以曲高和寡,大概是因为大部分的人看起来有难度。下面我总结了一下线性表的应用,以飨读者,为了方便初学者学习,每个程序都经过我调试运行,大家可阅之,运行之,有意见欢迎提出,欢迎留言。
基本的线性表有三种类型:顺序表、链表和静态链表,下面有三个程序,对应上述的三种链表。
顺序表:
/********************** 声明部分 **********************/#include<stdio.h> //输入输出函数头文件#include<stdlib.h> //内存申请函数头文件 #define LIST_INIT_SIZE 10 //定义最初申请的内存的大小#define LIST_INCREMENT 2 //每一次申请内存不足的时候扩展的大小#define OVERFLOW false //异常抛出返回值#define ERROR false //异常抛出返回值#define INFEASIBLE false //异常抛出返回值#define OK true //程序正确执行抛出返回值#define DestroyList ClearList //两个函数实现的效果是一样的#define MAX_SIZE 100 //最大的初始容量typedef int ElemType; //别名声明,其实int可以用任意的名字代入typedef bool Status; //别名声明 /********************** 结构体定义部分 **********************/typedef struct{ElemType data;int cur;}component,SLinkList[MAX_SIZE];void InitList(SLinkList L){int i;L[MAX_SIZE-1].cur = 0; //L的最后一个元素只想表头 for(i=0;i<MAX_SIZE;i++){L[i].cur = i+1;} L[MAX_SIZE-2].cur = 0;}int Length;void InitListAll(SLinkList L){int i;printf("Please input the list you want\n");scanf("%d",&Length);for(i=1;i<=Length;i++)scanf("%d",&L[i].data);}void OutList(SLinkList L){int i;for(i=1;i<=Length;i++)printf("%d ",L[i].data);}int LocateElem(SLinkList L,ElemType e){int i = L[0].cur;while(i&&L[i].data!=e) i = L[i].cur;return i;}//判断链表是否为空, int IsEmpty(SLinkList L){int i;i = L[0].cur;if(L[0].cur)L[0].cur = L[i].cur;return i;}//回收指定下标的节点到备用链表中 void Free(SLinkList L,int k){L[k].cur = L[0].cur;L[0].cur = k;} /********************** 一次输入两个集合的元素,建立(A-B)U(B-A)的静态链表,S为其头指针。假设备用空间足够大,L[0]为其头指针 **********************/void differecce(SLinkList &L,int &S){ int r,m,n,i,j; InitList(L); //初始化备用空间 S=IsEmpty(L); //生成S的头结点 r=S; //r指向S的当前最后节点 printf("please enter the length of A and B:"); scanf("%d %d",&m,&n); //输入A和B的元素个数 Length=m+n; for(j=1;j<=m;++j) //建立A的链表 { i=IsEmpty(L); //分配节点 scanf("%d",&L[i].data); //输入A的元素值 L[r].cur=i; //插入到表尾 r=i; } L[r].cur=0; //尾节点的指针为空 int b,p,k; for(j=1;j<=n;++j) //依次输入B元素,若不在当前表中,则插入,否则删除 { scanf("%d",&b); p=S; k=L[S].cur; //K指向集合A中第一个结点 while(k!=L[r].cur&&L[k].data!=b) {//在当前表中查找 p=k; k=L[k].cur; } if(k==L[r].cur) //假如当前表中没有所说的这个元素 { i=IsEmpty(L); L[i].data=b; L[i].cur=L[r].cur; L[i].cur=i; } else //该元素已经在表中,删除之 { Length--; L[p].cur=L[k].cur; Free(L,k); if(r==k) r=p; } }}int main(){ /********************** 函数声明区 **********************/ void InitList(SLinkList L); void InitListAll(SLinkList L); void OutList(SLinkList L); int LocateElem(SLinkList L,ElemType e); /********************** 程序执行区 **********************/ int e,number; SLinkList L; InitList(L); InitListAll(L); printf("please enter the number you want:"); scanf("%d",&e); number=LocateElem(L,e);// OutList(L); printf("the place is %d\n",number); return 0;}