数据结构-线性表-顺序表
2013-09-02 21:12
337 查看
/*国嵌版的顺序表,主要使用代码复用的原则*/ #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; typedef void SeqListNode; SeqList* SeqList_Create(int capacity); void SeqList_Destroy(SeqList* list); void SeqList_Clear(SeqList* list); int SeqList_Length(SeqList* list); int SeqList_Capacity(SeqList* list); int SeqList_Insert(SeqList* list, SeqListNode* node, int pos); SeqListNode* SeqList_Get(SeqList* list, int pos); SeqListNode* SeqList_Delete(SeqList* list, int pos); #endif #include "malloc.h" #include "SeqList.h" typedef unsigned int TSeqListNode; typedef struct _tag_SeqList { int capacity; int length; TSeqListNode* node; } TSeqList; SeqList* SeqList_Create(int capacity) { TSeqList* ret = NULL; if( capacity >= 0 ) { ret = (TSeqList*)malloc(sizeof(TSeqList)+capacity*sizeof(TSeqListNode)); } if( ret != NULL ) { ret->capacity = capacity; ret->length = 0; ret->node = (TSeqListNode*)(ret + 1); } return ret; } void SeqList_Destroy(SeqList* list) { free(list); } void SeqList_Clear(SeqList* list) { TSeqList* slist = (TSeqList*) list; if( slist != NULL) { slist->length = 0; } } int SeqList_Empty(SeqList* list) { TSeqList* slist = (TSeqList*)list; int ret = 0; if((slist != NULL) && (slist->length ==0)) { ret = 1; } return ret; } int SeqList_Length(SeqList* list) { TSeqList* slist = (TSeqList*) list; int ret = -1; if( slist != NULL) { ret = slist->length; } return ret; } int SeqList_Capacity(SeqList* list) { TSeqList* slist = (TSeqList*) list; int ret = -1; if( slist != NULL) { ret = slist->capacity; } return ret; } int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) { TSeqList* slist = (TSeqList*)list; int ret = (slist != NULL); ret = ret && (slist->length + 1 <= slist->capacity) && (0 <= pos) && (pos <= slist->capacity); int i=0; if(ret) { if(pos >= slist->length) { pos = slist->length; } for(i=slist->length;i>pos;i--) { slist->node[i] = slist->node[i-1]; } slist->node[i] = (TSeqListNode)(node); slist->length++; } return ret; } /*头插法*/ void SeqList_Insert_Head(SeqList * list, SeqListNode * node) { int i; TSeqList* slist = (TSeqList*)list; if((list!=NULL) && (node!= NULL)) { for(i = slist->length; i>0;i--) { slist->node[i] = slist->node[i-1]; } slist->node[0] = (TSeqListNode)node; slist->length++; } } /*尾插法*/ void SeqList_Insert_End(SeqList * list, SeqListNode * node) { int i; TSeqList* slist = (TSeqList*)list; if((list!=NULL) && (node!= NULL) && (slist->length+1<=slist->capacity)) { slist->node[slist->length] = (TSeqListNode)node; slist->length++; } } SeqListNode* SeqList_Get(SeqList* list, int pos) { TSeqList* slist = (TSeqList*)list; SeqListNode* ret = NULL; if((slist != NULL) && (0 <= pos) && (pos < slist->length)) //pos ±ØÐëСÓÚ length { ret = (SeqListNode*)(slist->node[pos]); } return ret; } SeqListNode* SeqList_Delete(SeqList* list, int pos) { TSeqList* slist = (TSeqList*)list; SeqListNode* ret = SeqList_Get(list, pos); int i =0 ; if(ret != NULL) { for(i=pos+1;i<slist->length;i++) { slist->node[i-1] = slist->node[i]; } slist->length--; } return ret; }
#include <stdio.h> #include <stdlib.h> #include "SeqList.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { SeqList* list = SeqList_Create(5); char i = 'a'; char j = 'b'; char k = 'c'; char x = 'd'; char y = 'e'; char z = 'f'; int index = 0; #if 0 SeqList_Insert(list, &i, 0); SeqList_Insert(list, &j, 0); SeqList_Insert(list, &k, 0); SeqList_Insert(list, &x, 0); SeqList_Insert(list, &y, 0); SeqList_Insert(list, &z, 0); SeqList_Insert_Head(list, &i); SeqList_Insert_Head(list, &j); SeqList_Insert_Head(list, &k); SeqList_Insert_Head(list, &x); SeqList_Insert_Head(list, &y); #endif SeqList_Insert_End(list, &i); SeqList_Insert_End(list, &j); SeqList_Insert_End(list, &k); SeqList_Insert_End(list, &x); SeqList_Insert_End(list, &y); for(index=0; index<SeqList_Length(list); index++) { char* p = (char*)SeqList_Get(list, index); printf("%c\n", *p); } printf("\n"); while( SeqList_Length(list) > 0 ) { char* p = (char*)SeqList_Delete(list, 0); printf("%c\n", *p); } printf("\nSeqList is Empty(%d)\n",SeqList_Empty(list)); SeqList_Destroy(list); return 0; }
/*大话数据结构版的*/ #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define EXIT 1 #define UNEXIT 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */ Status visit(ElemType c) { printf("%d ",c); return OK; } typedef struct { ElemType data[MAXSIZE]; /* 数组,存储数据元素 */ int length; /* 线性表当前长度 */ }SqList; /* 初始化顺序线性表 */ Status InitList(SqList *L) { L->length=0; return OK; } /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ Status ListEmpty(SqList L) { if(L.length==0) return TRUE; else return FALSE; } /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ Status ClearList(SqList *L) { L->length=0; return OK; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(SqList L) { return L.length; } /* 初始条件:顺序线性表L已存在,0≤i<listLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */ Status GetElem(SqList L,int pos,ElemType *e) { if(pos>=0 && pos<L.length) *e=L.data[pos]; return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0 */ int LocateElem(SqList L,ElemType e) { int i; for(i=0;i<L.length;i++) { if (L.data[i]==e) return EXIT; } return UNEXIT; } /* 初始条件:顺序线性表L已存在,0≤i≤ListLength(L), */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ Status ListInsert(SqList *L,int pos,ElemType e) { int k; if(L!= NULL && L->length + 1<=MAXSIZE && pos>=0 && pos<MAXSIZE) { if(pos>=L->length) { pos = L->length; } for(k = L->length-1; k>=pos; k--) { L->data[k+1] = L->data[k]; } L->data[pos] = e; L->length++; return OK; } return ERROR; } /* 初始条件:顺序线性表L已存在,0≤i<ListLength(L) */ /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度? */ Status ListDelete(SqList *L,int pos,ElemType *e) { ; int k; if(L!= NULL && e!= NULL && pos>=0 && pos<L->length) { *e = L->data[pos]; for(k = pos+1; k< L->length; k++) { L->data[k-1] = L->data[k]; } L->length--; return OK; } return ERROR; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素输出 */ Status ListTraverse(SqList L) { int i; for(i=0;i<L.length;i++) visit(L.data[i]); printf("\n"); return OK; } void unionL(SqList *La,SqList Lb) { int La_len,Lb_len,i; ElemType e; La_len=ListLength(*La); Lb_len=ListLength(Lb); for (i=0;i<Lb_len;i++) { GetElem(Lb,i,&e); if (!LocateElem(*La,e)) ListInsert(La,La_len++,e); } } int main() { SqList L; ElemType e; Status i; int j,k; i=InitList(&L); printf("初始化L后:L.length=%d\n",L.length); for(j=1;j<=5;j++) i=ListInsert(&L,0,j); printf("在L的表头依次插入1~5后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); i=ClearList(&L); printf("清空L后:L.length=%d\n",L.length); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); for(j=1;j<=10;j++) ListInsert(&L,j-1,j); printf("在L的表尾依次插入1~10后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); ListInsert(&L,0,0); printf("在L的表头插入0后:L.data="); ListTraverse(L); printf("L.length=%d \n",L.length); GetElem(L,5,&e); printf("第5个元素的值为:%d\n",e); for(j=3;j<=4;j++) { k=LocateElem(L,j); if(k) printf("第%d个元素的值为%d\n",k,j); else printf("没有值为%d的元素\n",j); } k=ListLength(L); /* k为表长 */ for(j=k+1;j>=k;j--) { i=ListDelete(&L,j,&e); /* 删除第j个数据 */ if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); } printf("依次输出L的元素:"); ListTraverse(L); j=5; ListDelete(&L,j,&e); /* 删除第5个数据 */ printf("删除第%d个的元素值为:%d\n",j,e); printf("依次输出L的元素:"); ListTraverse(L); //构造一个有10个数的Lb SqList Lb; i=InitList(&Lb); for(j=6;j<=15;j++) i=ListInsert(&Lb,0,j); printf("依次输出Lb的元素:"); ListTraverse(Lb); unionL(&L,Lb); printf("依次输出合并了Lb的L的元素:"); ListTraverse(L); return 0; }
相关文章推荐
- 数据结构 线性表 顺序表合并
- 数据结构线性表的两种存储形式顺序表和单链表的比较
- 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
- 数据结构-线性表-顺序表
- 数据结构-线性表-顺序表
- 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
- 数据结构(一)顺序表和线性表重点概述
- 数据结构线性表的综合实验——顺序表
- java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能
- 数据结构_线性表_顺序表 的创建,插入,删除,查找
- 数据结构-线性表_顺序表
- 数据结构-线性表-顺序表
- 数据结构 线性表 顺序表
- 【数据结构-线性表】顺序表
- 【数据结构学习2】线性表,顺序表定义中详细表述。
- 数据结构----线性表----单向链表
- 数据结构学习---线性表链表实现
- 《数据结构》第二章 线性表 问题回收站
- 数据结构顺序表的“增删改查”功能实现
- (2)数据结构——线性表(链表)实现