大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式。在定义中用一个ElemType * elem表示基地址,int length 表示当前长度,int listsize表示数组的大小。具体实现的代码如下:
/*
* 数据结构线性表顺序结构的实现
*/
#include<stdio.h>
#include<stdlib.h>
/*
ADT List{
//基本操作:
InitList(&L); //操作结果:构造一个空的线性表;
DestroyList(&L); //初始条件:线性表L已存在 操作结果:销毁线性表 L ;
ListEmpty(&L); //初始条件:线性表L已存在 操作结果:若L为空表,则返回TRUE,否则,返回FALSE ;
ListLength(&L); //初始条件:线性表L已存在 操作结果:若返回L中元素的个数 ;
GetElem(&L,i,e); //初始条件:线性表L已存在 操作结果:用e返回L中第i个数据元素的值;
ListInsert(&L,i,e); //初始条件:线性表L已存在,1<=I<=LiseLenght(L)+1 操作结果:第i个元素之前插入元素e ,L+1;
ListDelete(&L,i,&e); //初始条件:线性表L已存在,1<=I<=LiseLenght(L) 操作结果:删除第i个元素,并用e返回其值,L-1 ;
ListTraverse(&l,width) //初始条件:线性表L已存在, 操作结果:依次输出元素;
};
*/
#define TURE 1
#define FALSE 0
#define OK 1
#define SUCC 1
#define ERROR 0
#define LISTINCREMENT 1
#define LIST_INIT_SIZE 20
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem;//存储空间基地址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
Status InitList_Sq(SqList *L) {
// 构造一个空的线性表L,初始化存储容量和当前长度。
L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L->elem) return OK; // 存储分配失败
L->length = 0; // 空表长度为0
L->listsize = LIST_INIT_SIZE; // 初始存储容量
return OK;
}
Status DestroyList_Sq(SqList *L) {
//当L存在时,销毁顺序表
if(L->elem!=NULL){
free(L->elem);//线性表不为空时,依次释放
L->elem=NULL;
L->length = 0;
L->listsize = 0;
}
if(L->elem==NULL)
return SUCC;
}
Status ListTraverse_Sq(SqList *L, int Width){
//遍历输出线性表
int i;
for(i=0;i<L->length;i++){
printf("%3d",L->elem[i]);
if((i+1)%Width==0)
printf("\n");
}
printf("\n");
}
Status FillNumbers_Sq(SqList *L,int length, ElemType Number){
//给线性表一个初始化的数据
int i;
if(length<=L->listsize){
for(i=0;i<length;i++){
L->length++;//长度+1
L->elem[i]=Number++;//元素存入
// scanf("%d",&L->elem++);//也可用用户输入
}
}
return SUCC;
}
Status ListInsert_Sq(SqList *L,int i,ElemType e){
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType *p;
if (i < 1 || i > L->length+1) return ERROR; // i值不合法
if (L->length >= L->listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = (ElemType *)realloc(L->elem,
(L->listsize+LISTINCREMENT)*sizeof (ElemType));
if (!newbase) return ERROR; // 存储分配失败
L->elem = newbase; // 新基址
L->listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(L->elem[i-1]); // q为插入位置
for ( p= &(L->elem[L->length-1]); p>=q; --p) *(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++L->length; // 表长增1
return OK;
}
Status ListDelete_Sq(SqList *L,int i,ElemType *e){
// 在顺序线性表L中删除第i个元素,并用e返回其值。
// i的合法值为1≤i≤ListLength_Sq(L)。
ElemType *p, *q;
if (i<1 || i>L->length) return ERROR; // i值不合法
p = &(L->elem[i-1]); // p为被删除元素的位置
*e = *p; // 被删除元素的值赋给e
q = L->elem+L->length-1; // 表尾元素的位置
for (++p; p<=q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移
--L->length; // 表长减1
return OK;
}
Status GetElem_Sq(SqList *L,int i,ElemType *e){
//获取第i个元素的值,并存放到e
if (i < 1 || i > L->length+1) return ERROR; // i值不合法
*e=L->elem[i-1];
return SUCC;
}
void MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc) {
// 已知顺序线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。
ElemType *pla,*plb,*plc,*pla_last,*plb_last;
pla = La->elem; plb = Lb->elem;
Lc->listsize = Lc->length = La->length+Lb->length;
plc = Lc->elem = (ElemType *)malloc(Lc->listsize*sizeof(ElemType));
if (!Lc->elem)
return FALSE; // 存储分配失败
pla_last = La->elem+La->length-1;//la 最后一个元素的地址
plb_last = Lb->elem+Lb->length-1;
while (pla <= pla_last && plb <= plb_last) { // 归并插入
if (*pla <= *plb)
*plc++ = *pla++;
else
*plc++ = *plb++;
}
while (pla <= pla_last) *plc++ = *pla++; // 插入La的剩余元素
while (plb <= plb_last) *plc++ = *plb++; // 插入Lb的剩余元素
}
void main(){
int i=0,j=0, n,m,temp;
SqList myList,la,lb,lc;
InitList_Sq(&myList);
FillNumbers_Sq(&myList,20,1);
myList.elem[3]= 31;//随机存取
ListTraverse_Sq(&myList, 5);
printf("%d\n",myList.elem[3]);//随机存取
ListInsert_Sq(&myList,10,54);
printf("第10个位置插入54:\n");
ListTraverse_Sq(&myList, 5);
ListDelete_Sq(&myList,12,&m);
printf("第12个位置删除%d:\n",m);
ListTraverse_Sq(&myList, 5);
GetElem_Sq(&myList,15,&n);
printf("第15个元素为%d.\n",n);
InitList_Sq(&la);
InitList_Sq(&lb);
FillNumbers_Sq(&la,15,15);
FillNumbers_Sq(&lb,10,8);
MergeList_Sq(&la,&lb,&lc);
printf("LC:\n");
ListTraverse_Sq(&lc,5);
printf("La:\n");
ListTraverse_Sq(&la,5);
printf("Lb:\n");
ListTraverse_Sq(&lb,5);
DestroyList_Sq(&myList) ;
DestroyList_Sq(&la) ;
DestroyList_Sq(&lb) ;
DestroyList_Sq(&lc) ;
printf("销毁后La:\n");
ListTraverse_Sq(&la,5);
}
以下是程序运行的结果
以上便是我总结的数据结构线性表的相关知识和代码,有不足之处请多多指出,代码多为课本教材的参考总结和自己的灵活想象。
参考教材:《数据结构(C语言版)》严蔚敏 吴伟民 · 清华大学出版社