数据结构线性表的基本函数

来源:互联网 发布:ccn是什么网络 编辑:程序博客网 时间:2024/05/02 00:12

VS2010编译通过测试

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define TURE        1#define FLASE       0#define OK          1#define ERROR       0#define INFEASIBLE -1    //不可行#define OVERFLOW   -1#define LIST_INIT_SIZE 50  //线性表初始分配空间#define LISTINCREMENT  5  //线性表增量typedef int State;    //函数状态typedef int ElemType; //元素为整形/*********线性表类型结构定义************/typedef struct{ElemType *elem;  //储存空间基址int length;      //当前长度int listsize;    //当前分配的容量}Sqlist; /****************************************/// Sqlist L; //定义全局线性表State InitList(Sqlist &L){/**************线性表初始化********************/L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(L.elem==NULL)exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}/*************************************************/State DestroyList(Sqlist &L){/**************线性表销毁********************/if(L.elem==NULL)return ERROR;else free(L.elem);return OK;}/**************************************************/State ClearList(Sqlist &L){/**************将线性表重置为空表********************/if(L.elem==NULL)return ERROR;int i;ElemType *p_elem=L.elem;for(i=0;i<L.length;i++){*L.elem=NULL;        //L.elem地址处的元素置空L.elem++;}L.elem=p_elem;           //返回初始地址return OK;}/*******************************************************/State ListEmpty(Sqlist L){/**************判断线性表是否为空********************/return L.length == 0 ? TURE : FLASE;}/***************************************************/State ListLength(Sqlist L){/**************判断线性表长度********************/return L.length;}/***************************************************/State GetElem(Sqlist &L,int i){/**************返回线性表第i个值********************/if(i<1||i>L.length)exit(OVERFLOW);return L.elem[i-1];}/**********************************************************/State LocateElem(Sqlist L,ElemType e){/********************返回L中第一个满足e的位置,没有返回0***********************/int* p=L.elem;for(int i=1;i<L.length;i++){if(e==*L.elem){return i;}L.elem++;}return FLASE;}/**************************************************************************/State PriorElem(Sqlist L,ElemType cur_e){/********************返回L中cur_e的前驱***********************/int *p=L.elem;int i;for(i=1;i<=L.length;i++,p++){if(*p==cur_e)break;}if(i==L.length+1)        //线性表中无该元素return ERROR;if(i==1)              //无前驱return ERROR;return L.elem[i-2];   //返回前驱的地址}/*************************************************************/State NextElem(Sqlist L,ElemType cur_e){/********************返回L中cur_e的后继***********************/int *p=L.elem;int i;for(i=1;i<=L.length;i++,p++){if(*p==cur_e)break;}if(i==L.length)          return ERROR;      //无后继if(i==L.length+1)return ERROR;      //线性表中无该元素return L.elem[i];      //后继}/*******************************************************************/State ListInsert(Sqlist &L,int i,ElemType e){/********************将e插入到第i个元素前***********************/if(i<1||i>L.length+1)        //为什么 长度+1return OVERFLOW;  //插入位置超出线性表的范围if(L.length>=L.listsize){ //线性表已满int  *newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));  //分配新空间    if( !newbase)               exit(OVERFLOW);        //分配失败    L.elem=newbase;    L.listsize+=LISTINCREMENT;}/*int *q=&(L.elem[i-1]),*p;   // q为插入位置for (p = &(L.elem[L.length]); p>=q; --p)         *(p+1) = *p; // 插入位置及之后的元素右移                                     *q = e;     // 插入e*/int j=L.length;while(j>=i){L.elem[j]=L.elem[j-1];    //把包括第i个元素依次往后移j--;} L.elem[i-1]=e;                //插入元素L.length++;                   //长度加1return OK;}/*******************************************************************/State ListDelete(Sqlist &L,int i,ElemType &e){/********************删除第i个元素,并返回其值***********************/if(i<1||i>L.length)return OVERFLOW;      //i不再线性表内else if(i==L.length)       //若删除最后一个元素,直接置零,长度减1{L.elem[i]=0;L.length--;}else {while(i<L.length)           {L.elem[i-1]=L.elem[i];   //依次把第i个元素往前放置i++;}L.length--;}return e=L.elem[i-1];}/*******************************************************************/State ListTraverse(Sqlist L){/********************遍历线性表的每一个元素***********************/int i;for(i=0;i<L.length;i++){printf("%d  ",L.elem[i]);}printf("\n");return OK;}/*******************************************************************/int main(){Sqlist L;L.elem=NULL;     //!!!指针要初始化InitList(L);int i;for(i=1;i<=10;i++){ListInsert(L,i,i);}ListTraverse(L);ElemType e=0;ListDelete(L,5,e);    e = L.elem[3];ListTraverse(L);printf("元素 %d 下一个元素是: %d\n",e,NextElem(L,e));printf("元素 %d 前一个元素是: %d\n",e,PriorElem(L,e));printf("元素 %d 的位序是: %d\n",e,LocateElem(L,e));printf("线性表的第 %d 个元素是 : %d\n",9,GetElem(L,9));printf("当前线性表长度为:%d\n",ListLength(L));DestroyList(L);getchar();return 0;}