数据结构—顺序线性表

     最近在学习数据结构,感觉应该将书上的伪代码进行实现,因此花了几个小时写了下顺序线性表的各种函数实现:

实现代码如下:

#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef struct
{
	ElemType *elem;
	int length;
	int listsize;
}SqList;

int InitList(SqList *L);//构造空的线性表
void DestroyList(SqList *L);//销毁一个线性表
void ClearList(SqList *L);//将L置为空表
int ListEmpty(SqList L);//空表返回ture 
int ListLength(SqList L);//返回元素个数
int GetElem(SqList L,int i,ElemType *e);//用e返回第i个元素 
int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType));
//在L中找到与compare()的元素的位序
int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e);//用pre_e返回cur_e的前驱
int NextElem(SqList L,ElemType cur_e,ElemType *next_e);//用next_e返回cur_e的后继
int ListInsert(SqList *L,int i,ElemType e);//在第i个位置插入新元素e
int ListDelete(SqList *L,int i,ElemType *e);//删除第i个元素并且用e返回


int InitList(SqList *L)
{
	L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 
	if(!L->elem){
		printf("构造失败!\n");
		exit(OVERFLOW);
	}
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	printf("构造成功!\n");
	return OK;
}

void DestroyList(SqList *L)
{
	if(L->elem!=NULL)
	{
		free(L->elem);
		L->length=0;
		L->listsize=0;
		printf("已摧毁线性表\n"); 
	}
}

void ClearList(SqList *L)
{
	if(L->elem!=NULL)
	{
		L->length=0;
		printf("已将L置为空表\n");
	}
}

int ListEmpty(SqList L)
{
	if(L.elem!=NULL)
	{
		if(L.length == 0)
		{
			printf("是空表\n");
			return TURE;
		}
		else
		{
			printf("不是空表\n");
			return FALSE;
		}
	}
	else exit(ERROR);
}

int ListLength(SqList L)
{
	if(L.elem!=NULL)
	{
		return L.length;
	}
	else return ERROR;
}

int GetElem(SqList L,int i,ElemType *e)//用e返回第i个元素 
{
	if(ListEmpty(L))
	{
		printf("是空表\n");
		return ERROR;
	}
	if(i<1||i>L.length)
	{
		printf("不存在第%d个位置!\n",i);
		return ERROR;
	}
	*e=L.elem[i-1];
	return OK;
}

int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType))
//在L中找到与compare()的元素的位序
{
	int i=0;
	int *p=L.elem;
	while(i<=L.length && !(*compare)(*p++,e))
	{
		++i;
	}
	if(i<=L.length) return i;
 	else return FALSE;
}

int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)//用pre_e返回cur_e的前驱 
{
	int i=2;
	while(i<=L.length)
	{
		if(cur_e  == L.elem[i-1])
		{
			*pre_e=L.elem[i-2];
			return OK;
		}
		i++;
	}
	return ERROR;	
} 

int NextElem(SqList L,ElemType cur_e,ElemType *next_e)//用next_e返回cur_e的后继
{
	int i=1;
	while(i<L.length)
	{
		if(cur_e  == L.elem[i-1])
		{
			*next_e=L.elem[i];
			return OK;
		}
		i++;
	}
	return ERROR;
}

int ListInsert(SqList *L,int i,ElemType e)//在第i个位置插入新元素e
{
	ElemType *newbase,*p,*q;
	if(i<1 || i>L->length+1)
	{
		return ERROR;
	}
	if(L->length>=L->listsize)
	{
		newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		L->elem=newbase;
		L->listsize+=LISTINCREMENT;		
	}
	
	q=&(L->elem[i-1]);
	for(p=&(L->elem[L->length-1]);p>=q;p--)
	{
		*(p+1)=*p;
	}
	*q=e;
	L->length++;
	return OK; 
}

int ListDelete(SqList *L,int i,ElemType *e)//删除第i个元素并且用e返回
{
	ElemType *p,*q;
	if(i<1 || i>L->length)
	{
		return ERROR;
	}
	q=&(L->elem[i-1]);
	*e=*q;
	for(p=q;p<&(L->elem[L->length-1]);p++)
	{
		*p=*(p+1);
	}
	L->length--;
	return OK; 
}

int main()
{
	SqList L;
	ElemType m,e=0,cur_e,pre_e,next_e;
	char ch;
	int k,j,n;
	printf("初始化线性表...");
	InitList(&L);
	printf("是否销毁线性表L?Y/N?");
	ch =getchar();
	if(ch == 'Y' || ch == 'y')
	{
		DestroyList(&L);
		return 0;
	}
	else
	{
		ClearList(&L);
		for(int i=0;i<LISTINCREMENT;i++)
		{
			L.elem[i]=i+1;
			L.length++;
		}
		printf("线性表的初始值为:\n");
		for(int i=0;i<LISTINCREMENT;i++)
		{
			printf("%4d",L.elem[i]);
		}
		printf("\n");
		printf("线性表内的元素个数为:%d\n",ListLength(L));
		printf("欲想知道第k位的数字,请输入k=");
		scanf("%d",&k);
		j=GetElem(L,k,&e);
		printf("第%d位的数字是:%d\n",k,e);
		cur_e=e;
		PriorElem(L,cur_e,&pre_e);
		printf("%d的前驱是:%d\n",cur_e,pre_e);
		NextElem(L,cur_e,&next_e);
		printf("%d的后继是:%d\n",cur_e,next_e);
		printf("请输入要插入的位数和要插入的数字:(格式a,b)");
		scanf("%d,%d",&n,&m);
		ListInsert(&L,n,m);
		printf("插入后的线性表内的%d个数据为:\n",L.length);
		for(int i=0;i<L.length;i++)
		{
			printf("%4d",L.elem[i]);
		}
		printf("\n");
		ListDelete(&L,n,&m);
		printf("删除线性表中第%d个数据%d后,线性表内%d个数据为:\n",n,m,L.length);
		for(int i=0;i<L.length;i++)
		{
			printf("%4d",L.elem[i]);
		}
		printf("\n");
		return 0;
	}
 } 

这个代码在编译器里可以直接运行,写的过程有点太过仓促,如有不足还请大家多多指教。

猜你喜欢

转载自blog.csdn.net/zhangqianqian57/article/details/81747311