基础数据结构--线性表链式实现

以下代码为线性表的链式实现,在VS2012下测试通过。代码比较简单,所以注释只是标明了函数功能,如果有错误之处还请不吝赐教。

#include <stdio.h>
#include <stdlib.h>

//链表元素结构体
typedef struct listEle
{
	int data;
	struct listEle *next;
}listEle;

//链表结构体
typedef struct list
{
	listEle *head;
	int length;
}list;

//构造一个新的链表
list* createList()
{
	list *l = (list*)malloc(sizeof(list));
	l -> head = NULL;
	l -> length = 0;
	return l;
}

//清空链表
int clearList(list *&l)
{
	if(!l) return -1;
	listEle *temp = l->head;
	listEle *tempNext = NULL;
	int i = 0;
	for(;i<l->length && temp; ++i)
	{
		tempNext = temp->next;
		free(temp);
		temp = tempNext;
	}
	l->head = NULL;
	l->length = 0;
	temp = NULL;
	tempNext = NULL;
	return 1;
}

//销毁链表(l指针变为空指针)
void destroyList(list *&l)
{
	if(!l) return ;
	clearList(l);
	free(l);
	l = NULL;
	return ;
}

//获取链表长度
int getLength(list *l)
{
	if(!l) return -1;
	return l->length;
}

//判断链表是否为空
int isEmpty(list *l)
{
	if(!l) return -1;
	return l == NULL ? 0 :1;
}

//指定位置插入新元素
int insertElem(list *&l, int index, int *e)
{
	if(!l)
	{
		if(index != 0) return -1;
		l = createList();
	}
	if(index < 0 || index > l->length || !e) return -1;
	listEle *temp = l->head;
	listEle *newEle =  (listEle*)malloc(sizeof(listEle));
	newEle->data = *e;
	int i = 0;
	for(;i < index -1 && temp; ++i, temp = temp->next);
	if(i == index -1)
	{
		if(temp->next) newEle ->next = temp->next->next;
		else newEle->next = NULL;
		temp->next = newEle;
		++ (l->length);
		return 1;
	}
	else if(index == 0)
	{
		newEle->next = l->head;
		l->head =  newEle;
		++ (l->length);
		return 1;
	}
	return -1;
}

//在链表后添加新元素
int appendElem(list *&l, int *e)
{
	if(!l)	l = createList();
	listEle *temp = l->head;
	listEle *newEle = (listEle*)calloc(1,sizeof(listEle));
	newEle -> data = *e;
	newEle -> next = NULL;
	int i = 0;
	for(;i < l->length -1 && temp; ++i, temp = temp->next);
	if(l->length == 0)
	{
		l->head = newEle;
		++(l->length);
		return 1;
	}
	else if(i == l->length -1)
	{
		temp -> next = newEle;
		++ (l->length);
		return 1;
	}
	return -1;
}

//打印链表各个元素
void showList(list *l)
{
	if(!l)
	{
		printf("Error: list not exist!\n");
		return;
	}
	if( !l->head || l->length == 0)
	{
		printf("empty list\n");
		return;
	}
	listEle *temp = l->head;
	int i = 0;
	for(; i<l->length ; ++i)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
	return ;
}

//删除指定位置元素
int deleteElem(list *&l, int index)
{
	if(!l || !l->head || l->length == 0) return -1;
	if(index < 0 || index >= l->length) return -1;
	listEle *temp = l->head;
	listEle *deleteEle = NULL;
	int i = 0;
	for(;i<index -1 && temp; ++i, temp = temp->next);
	if(i == index -1)
	{
		deleteEle = temp->next;
		if(!deleteEle) return -1;
		temp->next = deleteEle->next;
		free(deleteEle);
		deleteEle = NULL;
		-- l->length;
		return 1;
	}
	else if(index == 0)
	{
		deleteEle = l->head;
		l->head = deleteEle->next;
		free(deleteEle);
		deleteEle = NULL;
		-- l->length;
		return 1;
	}
	return -1;
}

//获取链表指定位置元素值
int getElem(list *l, int index, int *&e)
{
	if(!l || !l->head || l->length == 0) return -1;
	if(index <0 || index >= l->length) return -1;
	listEle *temp = l->head;
	int i = 0;
	for(;i<index && temp; ++i, temp = temp->next);
	if(i == index)
	{
		e = (int*) malloc(sizeof(int));
		*e = temp -> data;
		return 1;
	}
	e = NULL;
	return -1;
}

//在指定位置后查找某一特定元素的位置
int findElem(list *l, int start, int *e)
{
	if(!l || !l->head || l->length == 0) return -1;
	if(start < 0 || start >= l->length) return -1;
	listEle *temp = l->head;
	int i = 0;
	for(; i<start && temp; ++i, temp = temp->next);
	if(i == start)
	{
		for(;i<l->length && temp; ++i, temp = temp->next)
		{
			if(temp ->data == *e) return i;
		}
		return -2;
	}
	return -1;
	
}

//获取某一特定元素前驱
int getPriorElem(list *l, int *e, int *&prior)
{
	if(!l || !l->head || l->length == 0 || !e) return -1;
	listEle *temp = l->head;
	while(temp) 
	{
		if(temp->next)
		{
			if(temp->next->data == *e)
			{
				prior = (int*)malloc(sizeof(int));
				*prior = temp -> data;
				return 1;
			}
		}
		temp = temp->next;
	}
	prior = NULL;
	return -2;
}

//获取某一特定元素后继
int getNextElem(list *l, int *e, int *&next)
{
	if(!l || !l->head || l->length == 0 || !e) return -1;
	listEle *temp = l->head;
	while(temp) 
	{
		if(temp->data == *e)
		{
			if(temp->next)
			{
				next = (int*)malloc(sizeof(int));
				*next = temp->next->data;
				return 1;
			}
			next = NULL;
			return -2;
		}
		temp = temp->next;
	}
	next = NULL;
	return -2;
}

int main()
{
	list *l = (list*)calloc(1,sizeof(list));
	l -> head = NULL;
	int e = 1;
	showList(l);
	insertElem(l,0,&e);
	e = 3;	
	insertElem(l,1,&e);
	showList(l);
	e = 4;
	insertElem(l,4,&e);
	showList(l);
	e = 10;
	insertElem(l,2,&e);
	e = 99;
	insertElem(l,3,&e);
	showList(l);

	int length = getLength(l);
	printf("list length: %d\n", length);
	e = 203;

	appendElem(l,&e);
	showList(l);

	int *s;
	getElem(l,3,s);
	printf("get answer: %d\n",*s);
	free(s);

	int ind = findElem(l,2,&e);
	printf("find answer: %d\n",ind);

	getPriorElem(l,&e,s);
	printf("prior answer: %d\n", *s);
	free(s);

	e = 1;
	getNextElem(l,&e,s);
	printf("prior answer: %d\n", *s);
	free(s);

	clearList(l);
	showList(l);
	destroyList(l);
	showList(l);
	free(l);
	getchar();
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值