学习笔记------数据结构(C语言版) 静态链表
2016-01-11 15:09
423 查看
//Function realization.cpp
//main.cpp
//StaticLinkedList.h
//predefined.h
注意:外部变量不要放在头文件中,否则容易出现重复定义外部变量,出现LNK2005错误。
#include"predefined.h" #include"StaticLinkedList.h" extern SLinkList space; void InitSpace_SL() //算法2.14:将一维数组space中各分量链成一个备用链表,(*space)[0].cur为头指针。 { for(int i=0;i<MAXSIZE-1;i++) space[i].cur=i+1; space[MAXSIZE-1].cur=0; } int Malloc_SL() //算法2.15:若备用空间链表为非空,则返回分配的节点下标。 { int i=space[0].cur; if(i) space[0].cur=space[i].cur; return i; } void Free_SL(int k) //算法2.16:将下标为k的空闲节点收到备用链表。 { space[k].cur=space[0].cur; space[0].cur=k; } void difference(int *S) //算法2.17:依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)∪(B-A)。 //的静态链表,S为其头指针。假设备用空间足够大,(*space)[0].cur为其头指针。 { int r,m,n,i,j,b,k,p; InitSpace_SL(); (*S)=Malloc_SL(); r=*S; printf("▼请输入集合A的个数: "); scanf("%d",&m); for(j=1;j<=m;j++) { i=Malloc_SL(); printf("▼请输入集合A第%d个数: ",j); scanf("%d",&space[i].data); space[r].cur=i; r=i; } space[r].cur=0; printf("▼请输入集合B的个数: "); scanf("%d",&n); for(j=1;j<=n;j++) { k=space[*S].cur; printf("▼请输入集合B第%d个数: ",j); scanf("%d",&b); p=*S; while(space[k].data!=b&&k!=space[r].cur) { p=k; k=space[k].cur; } if(k==space[r].cur)//若集合A中没有b,则插入。 { i=Malloc_SL(); space[i].data=b; space[r].cur=i; r=i; space[r].cur=0; } else//若集合A中已有b,则删除。 { space[p].cur=space[k].cur; Free_SL(k); if(k==r) r=p; } } } int LocateElem_SL(int H,ElemType e) //算法2.13:在静态单链线性表L中查找第1个值为e的元素。 //若找到,则返回它在L中的位序,否则返回0。 { int i=space[H].cur; int j=1; while(i) { if(space[i].data==e) return j; ++j; i=space[i].cur; } return FALSE; } Status InitList_SL(int *H)//初始化静态链表,建立头结点。 { *H=Malloc_SL(); if(!(*H)) exit(OVERFLOW); space[*H].cur=0; return OK; } Status ClearList_SL(int H)//置空 { int j,k; j=space[H].cur; while(j) { k=space[j].cur; Free_SL(j); j=k; } space[H].cur=0; return OK; } Status DestroyList_SL(int *H)//销毁 { int i; i=*H; while(i) { i=space[*H].cur; Free_SL(*H); *H=i; } return OK; } Status ListEmpty_SL(int H)//判空 { if(space[H].cur==0) return TRUE; else return FALSE; } int ListLength_SL(int H)//求长 { int n=0; int i=space[H].cur; while(i) { i=space[i].cur; n++; } return n; } Status GetElem_SL(int H,int i,ElemType *e)//取值 { int j,k; k=space[H].cur; j=1; while(k&&j<i) { k=space[k].cur; j++; } if(!k||j>i) return ERROR; *e=space[k].data; return OK; } Status PriorElem_SL(int H,ElemType cur_e,ElemType *e)//前驱 { int i; i=LocateElem_SL(H,cur_e); if(i<=1) return FALSE; GetElem_SL(H,i-1,e); return OK; } Status NextElem_SL(int H,ElemType cur_e,ElemType *e)//后继 { int i,j; i=LocateElem_SL(H,cur_e); j=ListLength_SL(H); if(!i||i>=j) return FALSE; GetElem_SL(H,i+1,e); return OK; } Status ListInsert_SL(int *H,int i,ElemType e)//插入 { if(i<1||i>ListLength_SL(*H)+1) return FALSE; int j,k; k=1; j=*H; while(k<i) { j=space[j].cur; k++; } k=Malloc_SL(); space[k].data=e; space[k].cur=space[j].cur; space[j].cur=k; return OK; } Status ListDelete_SL(int *H,int i,ElemType *e)//删除 { if(i<1||i>ListLength_SL(*H)) return FALSE; int j,k; k=1; j=*H; while(k<i) { j=space[j].cur; k++; } k=space[j].cur; space[j].cur=space[k].cur; *e=space[k].data; Free_SL(k); return OK; } Status ListTraverse_SL(int H,void (*visit)(int i))//访问 { int j,k; j=space[H].cur; k=0; while(k<ListLength_SL(H)) { visit(j); j=space[j].cur; k++; } return OK; }
//main.cpp
#include"predefined.h" #include"StaticLinkedList.h" SLinkList space; void visit(int i) { printf("%d ",space[i].data); } int main() { int H,n,m,i; ElemType e; Status s; printf("▼Function 1\n★函数InitSpace_SL()测试...\n"); printf("▲初始化静态链表的备用空间SPACE...\n\n"); InitSpace_SL(); printf("▼Function 2\n★函数Malloc_SL()、InitList_SL(int *H)测试...\n"); printf("▲初始化静态链表H,用Malloc_SL申请空间...\n\n"); InitList_SL(&H); printf("▼Function 3\n★函数ListEmpty_SL(int H)测试...\n"); s=ListEmpty_SL(H); s?printf("▲表H为空!!!\n\n"):printf("▲表H非空!!!\n\n"); printf("▼Function 4\n★函数ListInsert_SL(int *H,int i,ElemType e)测试...\n"); printf("▲请输入准备向H输入的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("▲请输入La第%d个数:",i); scanf("%d",&m); s=ListInsert_SL(&H,i,m); printf("▲插入成功?:%d (1:成功 0:失败)\n",s); } printf("\n"); printf("▼Function 5\n★函数ListTraverse_SL(int H,void (*visit)(int i))测试...\n"); printf("▲表H的元素为:H={"); ListTraverse_SL(H,visit); printf("}\n\n"); printf("▼Function 6\n★函数ListLength_SL(int H)测试...\n"); printf("▲表H的长度为:%d\n\n",ListLength_SL(H)); printf("▼Function 7\n★函数Free_SL(int k)、ListDelete_SL(int *H,int i,ElemType *e)测试...\n"); ListDelete_SL(&H,3,&e); printf("▲删除表H的第3个元素\"%d\",用Free_SL释放空间...\n",e); printf("▲表H的元素为:H={"); ListTraverse_SL(H,visit); printf("}\n\n"); printf("▼Function 8\n★函数GetElem_SL(int H,int i,ElemType *e)测试...\n"); GetElem_SL(H,3,&e); printf("▲表H的第3个元素是\"%d\"\n\n",e); printf("▼Function 9\n★函数LocateElem_SL(int H,ElemType e)测试...\n"); printf("▲元素8在H中的位序:\"%d\"\n\n",LocateElem_SL(H,8)); printf("▼Function 10\n★函数PriorElem_SL(int H,ElemType cur_e,ElemType *e)测试...\n"); PriorElem_SL(H,5,&e); printf("▲表H元素5的前驱为:%d\n\n",e); printf("▼Function 11\n★函数NextElem_SL(int H,ElemType cur_e,ElemType *e)测试...\n"); NextElem_SL(H,5,&e); printf("▲表H元素5的后继为:%d\n\n",e); printf("▼Function 12\n★函数ClearList_SL(int H)测试...\n"); printf("▲置空前:"); ListEmpty_SL(H)?printf("表H为空!!!\n"):printf("表H非空!!!\n"); ClearList_SL(H); printf("▲置空后:"); ListEmpty_SL(H)?printf("表H为空!!!\n\n"):printf("表H非空!!!\n\n"); printf("▼Function 13\n★函数DestroyList_SL(int *H)测试...\n"); printf("▲销毁前:"); H?printf("表H存 在!!!\n"):printf("表H不存在!!!\n"); DestroyList_SL(&H); printf("▲销毁后:"); H?printf("表H存 在!!!\n\n"):printf("表H不存在!!!\n\n"); printf("▼Function 13\n★函数difference(int *S)测试...\n"); difference(&H); printf("▲表H的元素为:H={"); ListTraverse_SL(H,visit); printf("}\n\n"); }
//StaticLinkedList.h
#define MAXSIZE 1000 typedef struct { ElemType data; int cur; }component,SLinkList[MAXSIZE]; void InitSpace_SL(); int Malloc_SL(); void Free_SL(int k); void difference(int *S); int LocateElem_SL(int H,ElemType e); Status InitList_SL(int *H); Status ClearList_SL(int H); Status DestroyList_SL(int *H); Status ListEmpty_SL(int H); int ListLength_SL(int H); Status GetElem_SL(int H,int i,ElemType *e); Status PriorElem_SL(int H,ElemType cur_e,ElemType *e); Status NextElem_SL(int H,ElemType cur_e,ElemType *e); Status ListInsert_SL(int *H,int i,ElemType e); Status ListDelete_SL(int *H,int i,ElemType *e); Status ListTraverse_SL(int H,void (*visit)(int i)); void visit(int i);
//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;
注意:外部变量不要放在头文件中,否则容易出现重复定义外部变量,出现LNK2005错误。