#include <STDIO.H>
#include <STDLIB.H>
#include <MALLOC.H>
#include <TIME.H>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
#define OVERFLOW 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct SqList
{
ElemType *base;
int length;//有效元素个数
int listsize;//静态链表长度
}SqList,*PSqList;
//初始化静态链表
Status InitList(PSqList L)
{
L->base=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->base)
exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
//销毁线性表
Status DestroyList(PSqList L)
{
free(L->base);
L->base=NULL;
L->length=0;
L->listsize=0;
return OK;
}
//返回线性表的长度
int ListLength(PSqList L)
{
return L->length;
}
//清空线性表
Status ClearList(PSqList L)
{
L->length=0;
return OK;
}
//判断L是否为空
Status ListEmpty(PSqList L)
{
return L->length==0;
}
//获取线性表第i个位置的元素,用e返回
Status GetElem(PSqList L,int i,ElemType *e)
{
if(i<1||i>L->length)
return ERROR;//位置不合法
else
{
*e=L->base[i-1];
return OK;
}
}
//判断两个元素是否相等
Status compare(ElemType e1,ElemType e2)
{
return e1==e2;
}
//返回线性表L中第一个与e满足关系compare的元素的下标
//下标从1开始
int LocateElem(PSqList L,int e,Status (*compare)(ElemType,ElemType))
{
int i ;
for (i=0;i<L->length;i++)
{
if((*compare)(e,L->base[i]))
return i+1;
}
return ERROR;
}
//获取当前元素(不是第一个元素)cur_e前驱,用pre_e返回,否则操作失败
Status PriorElem(PSqList L,ElemType cur_e,ElemType *pre_e)
{
int i;
*pre_e=NULL;
for (i=0;i<L->length;i++)
{
if(cur_e==L->base[i] && i!=0)
{
*pre_e=L->base[i-1];
return OK;
}
}
return FALSE;
}
//获取当前元素cur_e(不是最后一个)的下一个元素
Status NextElem(PSqList L,ElemType cur_e,ElemType *next_e)
{
int i;
*next_e=NULL;
for (i=0;i<L->length;i++)
{
if(cur_e==L->base[i] && i!=L->length-1)
{
*next_e=L->base[i+1];
return OK;
}
}
next_e=NULL;
return FALSE;
}
//在第i个元素位置之前插入e,L长度加1
Status InserElem(PSqList L,int i ,ElemType e)
{
ElemType *pCur,*pTail;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize)
{
L->base=(ElemType *)realloc(L->base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
if(!L->base)
exit(OVERFLOW);
L->listsize+=LISTINCREMENT;
}
pCur=&(L->base[i-1]);
pTail=&(L->base[L->length-1]);
for (;pTail>=pCur;pTail--)
{
*(pTail+1)=*pTail;
}
*pCur=e;
L->length++;
return OK;
}
//删除第i个位置的元素,用e返回
Status DeleteList(PSqList L,int i ,ElemType *e)
{
ElemType *pCur,*pTail;
if(i<1||i>L->length)
{
return ERROR;
}
*e=L->base[i-1];
pCur=&(L->base[i-1]);
pTail=&(L->base[L->length-1]);
for (pCur++;pCur<=pTail;pCur++)
{
*(pCur-1)=*pCur;
}
L->length--;
return OK;
}
Status visit(ElemType e)
{
printf("%d ",e);
return OK;
}
//遍历顺序表
Status TraverseList(PSqList L,Status (*visit)(ElemType))
{
int i ;
if(L->length==0)
return ERROR;
for (i=0;i<L->length;i++)
{
(*visit)(L->base[i]);
}
printf("\n");
return OK;
}
//追加元素
Status AppendList(PSqList L,ElemType e)
{
if(L->length>=L->listsize)
{
L->base=(ElemType *)realloc(L->base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
if(!L->base)
exit(OVERFLOW);
L->listsize+=LISTINCREMENT;
}
L->base[L->length]=e;
(L->length)++;
return OK;
}
void main()
{
int i;
ElemType e,pre_e,next_e;
SqList L;
InitList(&L);
srand(time(0));
for (i=0;i<10;i++)
{
AppendList(&L,rand()%100+1);
}
TraverseList(&L,visit);
printf("都有%d个元素\n",ListLength(&L));
printf("请输入一个数:\n");
scanf("%d",&e);
if(PriorElem(&L,e,&pre_e))
{
printf("%d的前驱是%d.\n",e,pre_e);
}
else
{
printf("%d无前驱\n",e);
}
if(NextElem(&L,e,&next_e))
{
printf("%d的后继是%d.\n",e,next_e);
}
else
{
printf("%d无后继\n",e);
}
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的元素:");
scanf("%d",&e);
InserElem(&L,i,e);
TraverseList(&L,visit);
printf("请输入要删除的位置:");
scanf("%d",&i);
DeleteList(&L,i,&e);
TraverseList(&L,visit);
printf("请输入要查找的元素:");
scanf("%d",&e);
printf("该元素在链表中的位置是:%d\n",LocateElem(&L,e,compare));
}
线性表(一)之线性表的顺序存储结构
最新推荐文章于 2020-11-28 15:09:14 发布