C语言从零开始之数据结构与算法顺序线性表基本操作(1)

#include <stdio.h>
#include <stdlib.h>
/**************************************************************************/
/* 抽象数据类型线性表基本操作*/
/* 1.InitList函数,初始化线性表,创建表头指针并置为NULL*/
/* 2.CreateList函数,创建线性表,此函数输入为负数则停止输入*/
/* 3.PrintList函数,遍历输出线性表*/
/* 4.DestroyList函数,销毁线性表释放内存空间*/
/* 5.ClearListt函数,清空线性表释放内存空间*/
/* 6.ListEmpty函数,判断若为空表返回OK,若为非空返回ERROR*/
/* 7.Listlength函数,返回线性表元素个数*/
/* 8.GetElem函数,返回线性表第i元素数据*/
/* 9.LocateElem函数,返回线性表第一个满足compare()函数的位序*/
/* 10.InsertList函数,插入线性表*/
/* 11.DeleteList函数,删除第i个元素*/
/* 12.ListTravers函数,对列表每个元素执行Vist()方法*/
/* 13 SortList函数,升序*/
/* 14 SortedList函数,降序*/
#define LIST_INIT_SIZE	100	//线性表存储空间的初始分配量
#define LISTINCREMENT	10 	//线性表存储空间的分配增量
#define OK				1	//成功标志1
#define ERROR			0	//失败标志0
typedef int	ElemType; 		//设置线性表保存数据类型
typedef struct {
	ElemType	*element;	//当前存储空间基地址
	int			length;		//当前长度
	int			listsize;	//当前分配的存储容量,以sizeof(ElemType)为单位
}SqList,*SqLinkList;

/***************************初始化线性表***********************************/
void InitList(SqList *L){	//初始化构造一个空的线性表L,L为表头指针,L->element 指向线性表元素首地址
	(*L).element=(ElemType *)malloc(LISTINCREMENT*sizeof(ElemType));	//分配初始存储空间
	if(!(*L).element){								//内存分配失败,退出函数
		printf("分配内存失败!\n");
		return;
	}
	(*L).length=0;									//设置线性表当前长度为0
	(*L).listsize=LIST_INIT_SIZE;					//线性表初始存储空间
}

/***************************创建线性表***********************************/
void CreateList(SqList *L){							//创建线性表,行参为之指针,函数方法改变指针所指地址的内容,则实参改变
	ElemType ch;	//接收输入的数据
	int i=0;
	printf("请输入数据: ");
	scanf("%d",&ch);
	getchar();										//消除回车键
	while(ch>0){									//数据大于0为真,循环继续
		if(L->length>=L->listsize){
			L->element=(ElemType *)realloc(L->element,
							(L->listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配内存空间,大小增加LISTINCREMENT
			if(!(*L).element){						//内存分配失败,退出函数
				printf("分配内存失败!\n");
				return;
			}
			L->listsize=L->listsize+LISTINCREMENT;
		}
		L->element[i++]=ch;								//element[i]第i个地址的内容
		L->length++;
		printf("请输入数据: ");							
		scanf("%d",&ch);								//重复输入数据
		getchar();										//消除回车键
	}
	printf("数据输入完毕!\n");
}

/***************************遍历输出打印线性表***********************************/
void PrintList(SqList L){		//遍历打印线性表内容
	if(L.length==0){
		printf("线性表为空,打印失败!\n");
		return;
	}
	printf("遍历线性表: ");
	for(int i=0;i<L.length;i++){
		printf("--%d--",L.element[i]);
	}
	printf("\n打印线性表完毕!\n");
}

/***************************销毁线性表***********************************/
int DestroyList(SqList *L){							//销毁线性表
	free(L->element);									//释放内存空间
	L->element=NULL;
	L->length=0;
	L->listsize=0;
	printf("销毁线性表成功!\n");
	return OK;
}

/***************************清空线性表***********************************/
int ClearList(SqList *L){								//清空线性表
	L->length=0;
	return OK;
}

/***************************判断是否为空线性表***********************************/
int ListEmpty(SqList L){
	if(L.length == 0)
		return OK;
	else
		return ERROR;
}

/***************************返回线性表元素个数***********************************/
int ListLength(SqList L){
	return L.length;
}

/***************************返回线性表第i个元素数据***********************************/
ElemType GetElem(SqList L,int i){
	if(i<0 || i>=L.length){
		printf("下标越界,返回失败!\n");
		return ERROR;
	}
	else
		return L.element[i];
}

/***************************返回线性表满足compare第1个元素位序***********************************/
int compare(ElemType e1,ElemType e2){
	if(e1 == e2)
		return OK;
	else
		return ERROR;
}

int LocateElem(SqList L,ElemType e,int compare(ElemType,ElemType)){
	ElemType *p=L.element;
	for(int i=0;i<L.length;i++){
		if(compare(*p++,e))
			return i;
	}
	return ERROR;
}

/***************************第i个位置插入元素e***********************************/
ElemType InsertList(SqList *L,int i,ElemType e){
	if(i<0 || i>L->length){
		printf("下标越界,插入失败!\n");
		return ERROR;
	}
	for(int j=L->length;j!=i;j--){
		L->element[j]=L->element[j-1];
	}
	L->element[i]=e;
	L->length+=1;
	return e;
}

/***************************删除第i个位置元素e***********************************/
ElemType DeleteList(SqList *L,int i){
	ElemType e;
	if(i<0 || i>=L->length){
		printf("下标越界,删除失败!\n");
		return ERROR;
	}
	e=L->element[i];
	for(int j=i+1;j<L->length;j++){
		L->element[j-1]=L->element[j];
	}
	L->length-=1;
	return e;
}

/***************************线性表元素执行VistElem操作***********************************/
int VistElem(ElemType *e){
	*e=(*e)*3;
	return OK;
}
int ListTravers(SqList *L,int VistElem(ElemType *)){
	int check;
	for(int i=0;i<L->length;i++){
		VistElem(L->element+i);
	}
        return OK;
}
 /**************************升序***********************************/
int SortList(SqList *L){
	int k;
	for(int i=0;i<L->length-1;i++){
		k=i+1;
		for(int j=k;j<L->length;j++){
			if(L->element[i]>L->element[j]){
				L->element[i]=L->element[i]^L->element[j];
				L->element[j]=L->element[i]^L->element[j];
				L->element[i]=L->element[i]^L->element[j];
			}
		}
	}
	return OK;
}

/**************************降序***********************************/
int SortedList(SqList *L){
	int k;
	for(int i=0;i<L->length-1;i++){
		k=i+1;
		for(int j=k;j<L->length;j++){
			if(L->element[i]<L->element[j]){
				L->element[i]=L->element[i]^L->element[j];
				L->element[j]=L->element[i]^L->element[j];
				L->element[i]=L->element[i]^L->element[j];
			}
		}
	}	
	return OK;
}


int main(){
	SqList L;
	ElemType ch,e;
	int a[] = {1504,3,42,42,8,183,22,238,85,18,22,18,31};
	InitList(&L);
	//CreateList(&L);
	PrintList(L);
	ClearList(&L);
	//DestroyList(&L);
	for(int i=0;i<(sizeof(a)/sizeof(int));i++){
		int cnt = rand()%(L.length+1);
		printf("cnt=%d\n",cnt);
		InsertList(&L,cnt,a[i]);
		PrintList(L);
		SortedList(&L);
		PrintList(L);
	}
	printf("GetElem:\n");
	/*for(int i=0;i<(sizeof(a)/sizeof(int));i++){
		int cnt = rand()%(L.length+1);
		ch=GetElem(L,cnt);
		PrintList(L);
		printf("a[%d]=%d\n",cnt,ch);
	}
	printf("\n");*/
	/*for(int i=0;i<L.length;i++){
		int cnt = rand()%(12);
		e=a[cnt];
		ch=LocateElem(L,e,compare);
		printf("a[%d]=%d\n",ch,e);
	}*/
	/*printf("\n");
	for(int i=L.length;i>0;i--){
		int cnt = rand()%(L.length);
		ch=DeleteList(&L,cnt);
		printf("L=%d,a[%d]=%d\n",L.length,cnt,ch);
		PrintList(L);
	}
	printf("\n");*/
	/*for(int i=0;i<(sizeof(a)/sizeof(int));i++){
		ListTravers(&L,VistElem);
		PrintList(L);
	}*/
	printf("\n");
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值