万事开头难。
参考了严蔚敏的数据结构教材,写了如下代码。
新手上路还请老鸟多多指教。
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define True 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
#define LIST_INCREMENT 2 //线性表存储空间的分配增量
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
//---------------初始化(实质为SqList三个属性赋初值)-------------
Status InitList(SqList *L)
{
//构造一个空的线性表L
(*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!(*L).elem)
exit(OVERFLOW);
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
//-----------------------插入元素-------------------------
Status ListInsert(SqList *L,int i,ElemType e)
{
/*
实现过程梳理:
1.判断插入位置的合法性
2.判断存储空间是否够
3.移动i位置以后的所有元素
4.插入新的值并表长自增
*/
ElemType * newbase, * q, * p;
if(i < 1 || i > (*L).length + 1) //i的值不合法
return ERROR;
if((*L).length >= (*L).listsize)
{
newbase = (ElemType * )realloc((*L).elem,((*L).listsize + LIST_INCREMENT) * sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
(*L).elem = newbase;
(*L).listsize += LIST_INCREMENT;
}
q = (*L).elem + i - 1 ; //q 指向第i个位置
for(p = (*L).elem + (*L).length - 1; p >= q ; --p) //插入位置及之后的元素后移
* (p + 1) = * p;
* q = e; //插入元素e
++(*L).length; //表长增1
return OK;
}
//------------------------删除元素--------------------------
Status ListDelete(SqList *L,int i,ElemType *e)
{
/*
实现过程梳理:
1.判断插入位置的合法性
2.被删除元素之后的元素向前移动
*/
ElemType * p,* q;
if(i < 1 || i > (*L).length )
return ERROR;
p = (*L).elem + i - 1;
* e = * p;
q = (*L).elem + (*L).length - 1;
for(++p ; p <= q ; ++p)
*(p - 1) = * p;
--(*L).length;
return OK;
}
//-----------------------返回表长-------------------------
int ListLength(SqList L)
{
return L.length;
}
//------------------------返回元素---------------------------
Status GetElem(SqList L,int i,ElemType *e)
{
if(i < 1 || i > L.length)
exit(ERROR);
* e = * (L.elem + i - 1);
return OK;
}
//--------------------返回某个元素的位置---------------------
int LocateElem(SqList L,ElemType e,Status(* compare)(ElemType,ElemType))
{
ElemType * p;
int i = 1;
p = L.elem;
while(i <= L.length && !compare(*p++,e))
i++;
if(i <= L.length)
return i;
else
return 0;
}
Status compare(ElemType c1,ElemType c2)
{
if(c1 == c2)
return True;
else
return FALSE;
}
//------------------------遍历线性表-------------------------
Status ListTraverse(SqList L, void(* visit)(ElemType *c))
{
ElemType * p;
int i;
p = L.elem;
for(i = 1 ; i <= L.length ;i ++)
visit(p++);
printf("\n");
return OK;
}
void visit(ElemType *c)
{
printf("%d ", *c);
}
-------------------以下为main函数----------------
int main()
{
SqList L;
ElemType e;
Status i;
i = InitList(&L);
printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
int j,k,position;
for(j = 1 ; j <= 5 ; j++)
i = ListInsert(&L,1,j);
printf("在L的表头依次插入1 - 5之后:\n");
for(j = 1 ; j <= 5 ; j++)
printf("%d ",*(L.elem + j - 1));
printf("\n");
printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
for(j = 1 ;j <= 10 ;j++)
ListInsert(&L,j,j);
printf("继续插入元素,即在位置 1 - 10 依次插入元素 1 - 10 后:\n");
for(j = 1 ; j <= ListLength(L) ; j++)
printf("%d ",*(L.elem + j - 1));
printf("\n");
printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
GetElem(L,5,&e);
printf("第五个元素的值为:%d\n",e);
position = LocateElem(L,10,compare);
printf("元素10的position是:%d\n",position);
i = ListDelete(&L,8,&e);
printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
printf("删除第8个元素后:遍历顺序表的结果为:\n");
i = ListTraverse(L,visit);
}