顺序表的定义和特点
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构
特点 线性表的顺序存储方式
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构
特点 线性表的顺序存储方式
遍历 顺序访问, 可以随机存取
头文件:
#ifndef _SEQUENCE_H_
#define _SEQUENCE_H_
#define MAXSIZE 10
#define success 10000
#define failure 10001
#define TRUE 10002
#define FALSE 10003
typedef int ElemType;
struct sequence
{
ElemType *data;
int length;
int size;
};
typedef struct sequence selist;
int ListInit(selist *s);
int ListInsert(selist *a,int i,ElemType e);
int Listlength(selist s);
int Emptylist(selist s);
int GetElem(selist s,int p,ElemType *e);
int ListTraverse(selist s ,void(*print)(ElemType));
int Listdel(selist *s,int i);
#endif
顺序表接口:
#include <stdio.h>
#include"squencelist.h"
#include<stdlib.h>
int ListInit(selist *s) //初始化
{
s->data =(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
if(NULL == s->data)
{
return failure;
}
s->size = MAXSIZE;
s->length = 0;
return success;
}
int ListInsert(selist *a,int i,ElemType e) //插入
{
int k;
if(i < 0 || i >= MAXSIZE )
{
return failure;
}
if(a->length >= MAXSIZE)
{
return failure;
}
for(k = 0;k < a->length - i;k++)
{
a->data[a->length - k]=a->data[a->length - 1 - k];
}
a->data[i] = e;
a->length++;
return success;
}
int Listlength(selist s) //计算顺序表长度
{
return s.length;
}
int Emptylist(selist s) //判断顺序表是否是空
{
return (s.length == 0) ? TRUE : FALSE;
}
int GetElem(selist s,int p,ElemType *e) //取出顺序表中的元素
{
if(p < 0 || p >= MAXSIZE )
{
return failure;
}
*e = s.data[p];
return success;
}
int ListTraverse(selist s,void(*print)(ElemType)) //遍历顺序表
{
int i;
for(i = 0 ; i < s.length ; i++)
{
print(s.data[i]);
}
return success;
}
int LocateElem(selist s,ElemType e ,int (*compare)(ElemType ,ElemType)) //查找元素
{
int i;
for(i = 0 ; i < s.length ; i++)
{
if(compare(e,s.data[i]) == TRUE)
{
return i;
}
}
return failure;
}
int Listdel(selist *s,int i) //删除元素
{
int j;
if(i < 0 || i>= MAXSIZE)
return failure;
for(j = 0 ;j < s->length - i - 1 ; j++)
{
s->data[j + i] = s->data[j + i + 1];
}
s->length--;
return success;
}
主函数:
#include<stdio.h>
#include"squencelist.h"
void visit(ElemType e)
{
printf("%d ",e);
}
int equal(ElemType a, ElemType b)
{
return (a == b) ? TRUE : FALSE;
}
int main()
{
int ret,i;
selist slist;
int place;
ElemType e;
int locate;
ret = ListInit(&slist);
if(success == ret )
{
printf("Init Success!\n");
}
else
{
printf("Init failure!\n");
}
for(i = 0;i < 5;i++)
{
ret = ListInsert(&slist,i,i+1);
if(success == ret)
{
printf("Insert %d success!\n",i + 1);
}
else
{
printf("Insert %d Failure!\n",i);
}
}
ret = ListInsert(&slist,2,4);
if(success == ret)
{
printf("Insert %d success!\n",4);
}
else
{
printf("Insert %d Failure!\n",i);
}
printf("length:%d\n",Listlength(slist));
ret = Emptylist(slist);
if(TRUE == ret )
{
printf("empty!\n");
}
else if(FALSE == ret)
{
printf("not empty\n");
}
place = 3;
ret = GetElem(slist ,place,&e);
if(success == ret)
{
printf("%d element is %d \n",place,e);
}
else
{
printf("failure!\n");
}
ret = ListTraverse(slist,visit);
if(success == ret)
{
printf("traverse success!\n");
}
else
{
printf("traverse failure!\n");
}
e=4;
ret = LocateElem(slist,e,equal);
if(failure == ret)
{
printf("not find");
}
else
{
printf("%d's xia biao is %d!\n",e,ret);
}
locate = 5;
ret = Listdel(&slist,locate);
{
if(success == ret)
printf("del success!\n");
else
printf("del failure!\n");
}
ret = ListTraverse(slist,visit);
if(success == ret)
{
printf("traverse success!\n");
}
else
{
printf("traverse failure!\n");
}
}