线性表的顺序表示和实现

来源:互联网 发布:spss mac和spss的区别 编辑:程序博客网 时间:2024/05/29 17:57

最近想利用空余时间把严蔚敏老师《数据结构》里面的算法用C语言都敲一遍,不知道能坚持多久,总之要努力。

本文是对《数据结构》线性表的顺序表示和实现这节的算法用C语言的实现,已成功在Linux上运行。

线性表的顺序表示的结构和算法就去看严蔚敏老师《数据结构》啦,直接贴代码。

#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100    //线性表存储空间的初始化分配量#define LISTINCREMENT 10      //线性表存储空间的分配增量//函数结果代码#define TRUE       1#define FALSE      0#define OK         0#define ERROR      1#define OVERFLOW  -1typedef int Status;           //函数的类型,其结果是函数结果状态代码typedef struct {int * elem;    //存储空间基址int length;    //当前长度int listsize;//当前分配的存储容量(以sizeof(int)为单位)}SqList;//函数声明Status InitList_Sq(SqList *);Status TraverseList_Sq(SqList *);Status EmptyList_Sq(SqList *);Status FullList_Sq(SqList *);Status ListAppend_Sq(SqList *, int);Status ListInsert_Sq(SqList *, int, int);Status ListDelete_Sq(SqList *, int, int *);Status GetElem(SqList *,int,int *);int LocateElem(SqList *,int);void UnionList_Sq(SqList *, SqList *);void MergerList_Sq(SqList * La, SqList * Lb, SqList * Lc);Status main(void) {int i, e;SqList La, Lb, Lc;if (InitList_Sq(&La) || InitList_Sq(&Lb) || InitList_Sq(&Lc)) {printf("创建线性表失败!\n");return ERROR;}/*for (i=0; i<10; ++i)ListAppend_Sq(&La,i);for (i=0; i<8; ++i)ListAppend_Sq(&Lb,i*2);*/ListAppend_Sq(&La,3);ListAppend_Sq(&La,5);ListAppend_Sq(&La,8);ListAppend_Sq(&La,11);ListAppend_Sq(&Lb,2);ListAppend_Sq(&Lb,6);ListAppend_Sq(&Lb,8);ListAppend_Sq(&Lb,9);ListAppend_Sq(&Lb,11);ListAppend_Sq(&Lb,15);ListAppend_Sq(&Lb,20);TraverseList_Sq(&La);TraverseList_Sq(&Lb);MergerList_Sq(&La, &Lb, &Lc);TraverseList_Sq(&Lc);//e = LocateElem(&L,5);//printf("%d \n",e);//ListInsert_Sq(&L,11,100);//TraverseList_Sq(&L);//ListDelete_Sq(&L,5,&e);//TraverseList_Sq(&L);return OK;}//初始化函数,构建一个空的线性表LStatus InitList_Sq(SqList * L){//构造一个空的线性表LL->elem = (int *)malloc(sizeof(int) * LIST_INIT_SIZE);if (! L->elem) {exit(OVERFLOW);                //存储分配失败} L->length = 0;                     //空表,长度为0L->listsize = LIST_INIT_SIZE;      //初始存储容量return OK;}//遍历输出Status TraverseList_Sq(SqList * L){int i;if (0 == L->length) {       //判断线性表是否为空printf("线性表为空!\n");return ERROR;}for (i=0; i < L->length; ++i) {printf("%d\t",L->elem[i]);}printf("\n");return OK;}//判断线性表是否为空Status EmptyList_Sq(SqList * L){if (0 == L->length ) return TRUE;else return FALSE;}//判断线性表是否满Status FullList_Sq(SqList * L) {if (L->length == L->listsize) return TRUE;else return FALSE;}//在线性表当前位置追加新元素e,即给线性表赋值Status ListAppend_Sq(SqList * L, int e){int * newbase = NULL;if (L->length >= L->listsize) {     //如果当前存储空间已满,增加分配newbase = (int *)realloc(L->elem, sizeof(int) * (L->listsize + LISTINCREMENT));if (! newbase)exit(OVERFLOW);                //存储分配失败L->elem = newbase;                //新基址L->listsize += LISTINCREMENT;     //增加存储容量}L->elem[(L->length)++] = e;          //赋值return OK;}//在线性表中的第i个位置之前插入新的数据元素e,L的长度加1Status ListInsert_Sq(SqList * L, int i, int e){int * p, *q;int * newbase = NULL;if (L->length >= L->listsize) {     //如果当前存储空间已满,增加分配newbase = (int *)realloc(L->elem, sizeof(int) * (L->listsize + LISTINCREMENT));if (! newbase)exit(OVERFLOW);                //存储分配失败L->elem = newbase;                //新基址L->listsize += LISTINCREMENT;     //增加存储容量}q = &L->elem[i-1];      //要插入的位置for (p = &L->elem[L->length-1]; p>=q; --p) //插入位置及之后的元素右移*(p+1) = *p;*q = e;        //插入e++L->length;   //表长加1return OK;}//删除线性表中的第i个位置的元素e,并使用e返回其值,L的长度减1Status ListDelete_Sq(SqList * L, int i, int * e){int * p, *q;//i的合法值为1到length之间if ((i<1) || (i>L->length))        //i值不合法return ERROR;p = &(L->elem[i-1]);               //p为被删除元素的位置*e = *p;                           //被删除元素的值赋给eq = L->elem + L->length -1;       //表尾元素的位置for (++p; p<=q; ++p)  //被删除位置及之后的元素左移*(p-1) = *p;--L->length;   //表长减1return OK;}//用e返回L中第i个数据元素的值Status GetElem(SqList * L,int i,int * e){//i的合法值为1到length之间if ((i<1) || (i>L->length))   //i值不合法return ERROR;*e = L->elem[i-1];            //取出第i个元素的值return OK;}//返回线性表中第一个与e相等的位置,若不存在则返回0int LocateElem(SqList * L,int e){int i = 1;           //i的初值为第一个元素的位序int * p = L->elem;   //p的初值为第一个元素的储存位置while ((i <= L->length) && (*p != e)) {++i;++p;}if (i <= L->length)return i;elsereturn 0;}//例2-1,将所有在线性表Lb中但不再La中的数据元素插入到La中void UnionList_Sq(SqList * La, SqList * Lb){int La_len, Lb_len, i, e;La_len = La->length;   //线性表La的长度Lb_len = Lb->length;   //线性表La的长度for (i=1; i<=Lb_len; ++i) {GetElem(Lb, i, &e);     //取出Lb中的第i个元素赋给eif (! LocateElem(La,e)) {ListAppend_Sq(La,e); //La中不存在和e相同的数据元素,则追加之(用插入函数也行)}}}//例2-2,已知线性表La和Lb中的数据元素按值非递减排序,归并La和Lc得到新的线性表Lc,Lc的数据元素也按值非递减排序void MergerList_Sq(SqList * La, SqList * Lb, SqList * Lc){int La_len, Lb_len, i, j, k, ai, bj;InitList_Sq(Lc);    //初始化Lc使其为空表La_len = La->length;   //线性表La的长度Lb_len = Lb->length;   //线性表La的长度i = j = 1;k = 0; while ((i<=La_len) && (j<=Lb_len)) {   //La和Lb均非空GetElem(La, i, &ai); GetElem(Lb, j, &bj); if ( ai <= bj) {ListInsert_Sq(Lc, ++k, ai);++i;}else {ListInsert_Sq(Lc, ++k, bj);++j;}}while (i<=La_len) {GetElem(La, i++, &ai);ListInsert_Sq(Lc, ++k, ai);}while (j<=Lb_len) {GetElem(Lb, j++, &bj);ListInsert_Sq(Lc, ++k, bj);}}/*//自己写的void MergerList_Sq(SqList * La, SqList * Lb, SqList * Lc){int La_len, Lb_len, i, j, e;La_len = La->length;   //线性表La的长度Lb_len = Lb->length;   //线性表La的长度*Lc = *Lb;     //将Lb的值赋给Lcfor (i=1; i<=La_len; ++i) {   //遍历LaGetElem(La, i, &e);     //取出La中的第i个元素赋给efor (j=0; j<Lb_len; ++j) {     //跟Lc中的元素比较if (Lc->elem[j] >= e) {ListInsert_Sq(Lc, j+1, e);++Lb_len;break;}}}}*/