数据结构是计算机类学生基本上必修的一门课程,也是比较难得一门课程。对于初学者来说刚开始学肯定会不理解,感觉很难,所以最近写了个数据结构的顺序表。顺序表包含了初始化、判空、求表长、销毁、定位、删除、插入、等十二个基本操作。运行了一下感觉还可以,所以想拿出来和大家分享一下!以下是源代码,建立一个工程
第一个头文件:一些基本的定义声明
#include
#include
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW -1
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem;
int length;
int listsize;
}Sqlist;
第二个头文件:十二个基本函数
#include"header.h"
//1、初始化
Status InitList(Sqlist&L)
{
L.elem=((ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)));
if(!L.elem)
return ERROR;
L.length=0;
L.listsize= LIST_INIT_SIZE;
return OK;
}
//2、销毁
void Destorylist(Sqlist&L)
{
if(L.elem)
free(L.elem);
L.elem=NULL;
}
//3、清空
void ClearList(Sqlist &L)
{
L.length=0;
}
//4、判空
Status EmptyList(Sqlist L)
{
if(L.length==0)
return TURE;
else
return FALSE;
}
//5、求表长
Status LengthList(Sqlist L)
{
return L.length;
}
//6、取元素
Status GetElem(Sqlist L, int i, ElemType &e)
{
if(i<1||i>L.length)
return ERROR;
else
return e=L.elem[i-1];
}
// 7、定位操作
Status LocateELem(Sqlist L, ElemType e)
{
int i=0;
for (i = 0; i < (L.length - 1); i++)
{
if(e==L.elem[i])
return i+1;
}
}
//8、求前驱
Status PriorElem(Sqlist L, ElemType pur_e, ElemType pre_e)
{
int i;
ElemType *p,*q;
p=&L.elem[0];
for (i = 1; i < L.length - 1; i++)
{
if(pur_e==L.elem[i])
{
p=&L.elem[i];
break;
}
}
q=p-1;
pre_e=*q;
return pre_e;
}
//9、求后继
Status NextElem(Sqlist L, ElemType pur_e, ElemType next_e)
{
int i;
ElemType *p,*q;
p=&L.elem[0];
for (i = 0; i < L.length - 2; i++)
{
if (pur_e == L.elem[i])
{
p=&L.elem[i];
break;
}
}
q=p+1;
next_e=*q;
return next_e;
}
//10、插入
Status InsertElem(Sqlist L, int i, ElemType e)
{
ElemType *p,*q;
if(i<1||i>L.length)
return ERROR;
if (L.length == L.listsize)
{
L.elem=((ElemType*)realloc(L.elem,(LIST_INIT_SIZE+ LISTINCREMENT)*sizeof(ElemType)));
L.listsize= LIST_INIT_SIZE + LISTINCREMENT;
}
q=&L.elem[i-1];
for (p = &L.elem[L.length - 1]; p > q; p--)
*(p+1)=*p;
*(q+1)=e;
L.length++;
return e;
}
//11、删除
Status DeleteElem(Sqlist &L, int i, ElemType e)
{
ElemType *p,*q;
if(!L.elem)
return ERROR;
if(i<1||i>L.length)
return ERROR;
q=&L.elem[i-1];
e=*q;
for (p = &L.elem[i - 1]; p <&L.elem[L.length - 1]; ++p)
{
* p=*(p+1);
}
L.length--;
return e;
}
//12、遍历
void TraverList(Sqlist L)
{
int i;
for (i = 0; i < L.length; i++)
printf("%5d",L.elem[i]);
}
//14、比较
Status CompareList(Sqlist L, ElemType e1, ElemType e2)
{
if(e1>e2||e2==e2)
return TURE;
else
return FALSE;
}
主函数:对十二个基本操作的测试
#include "stdafx.h"
#include"header1.h"
int main()
{
Sqlist L;
InitList(L);
int a,b,c,d=0,f,g,i;
ElemType e=0;
//初始化测试
printf("初始顺序表的长度%d\n\n", LengthList(L));
printf("请输入要添加的元素个数:");
scanf_s("%d",&L.length);
//求表长测试
printf("\n当前顺序表的长度%d\n",LengthList(L));
printf("\n请输入线性表元素:");
for (i = 0; i
//遍历测试
printf("\n您输入的元素为:");
TraverList(L);
printf("\n");
//定位操作
printf("请输入你要定位的元素:");
scanf_s("%d",&g);
printf("%d的位置为:%d\n",g,LocateELem(L,g));
//求前驱测试
printf("请输入你想求前驱的元素:");
scanf_s("%d",&a);printf("\n");
printf("%d的前驱为:%d",a, PriorElem(L,a,d));
//求后继测试
printf("\n请输入你想求后继的元素: ");
scanf_s("%d",&f);printf("\n");
printf("%d的后继为:%d",f,NextElem(L,f,d));
//取元素测试
printf("\n接下来测试取元素\n\n请输入你想取出的元素位序:");
scanf_s("%d",&i);
printf("\n\n");
printf("你取出的元素为:%d",GetElem(L,i,e));
printf("\n\n");
//删除测试
printf("现在测试删除\n\n请输入删除位置: ");
scanf_s("%d",&b);
printf("\n");
printf("你删除的元素为: %d",DeleteElem(L,b,e));
printf("\n\n");
printf("现在线性表中的元素为:");
for(i=0;i
//插入测试
printf("\n现在测试插入\n");
printf("请输入你要插入的位置:");
scanf_s("%d",&c);
printf("\n");
printf("请输入你要插入的元素:");
scanf_s("%d",&e);
printf("\n");
printf("你插入的元素为:%d",InsertElem(L,c-1,e));
printf("\n");
printf("现在顺序表为: ");
for (i = 0; i < L.length + 1; i++)
printf("%5d",L.elem[i]);
return 0;
}
不懂得可以私信 [email protected]!