数据结构:链表

经过这几天的练习和做停车场项目,发现链表的应用非常广泛,如果可以用好它,可以解决很多的问题。所以整理一遍链表的内容。  


特点 :


  每个元素(表项)由结点(Node)构成。

  线性结构 。

  结点可以连续,可以不连续存储。

  结点的逻辑顺序与物理顺序可以不一致。

  表可扩充。


#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#define SUCCESS 1000001
#define FAILURE 1000002
#define TRUE    1000003
#define FALSE   1000004

typedef int ElemType;

struct node
{
	ElemType data;
	struct node *next;
};

typedef struct node Node;
typedef Node *LinkList;

int ListInit(LinkList *L);
int ListInsert(LinkList *L,int i, ElemType e);
int ListTraverse(LinkList l,void(*print)(ElemType));
int GetElem(LinkList l,int k,ElemType *e);
int ListLength(LinkList l);
int ListEmpty(LinkList l);
int ListDelete(LinkList l,int i,ElemType *e);
int ListClean(LinkList l);
int ListDestroy(LinkList *l);

#endif


主函数:

#include<stdio.h>
#include"linklist.h"

void visit(ElemType a)
{
	printf("%d ",a);
}

int main()
{
	int ret,i;
	int place =0;
	ElemType e;
	LinkList list;

	ret = ListInit(&list);
	if(FAILURE == ret)
	{
		printf("Init Failure!\n");
	}
	else 
	{
		printf("Init success!\n");
	}

	for(i = 0; i<10; i++)
	{
		ret = ListInsert(&list,i+1,i+1);
		if(FAILURE == ret)
		{
			printf("Insert %d Failure!\n",i+1);
		}
		else
		{
			printf("Insert %d Success!\n",i+1);
		}
	}

	ret = ListTraverse(list,visit);
	if(FAILURE == ret)
	{
		printf("Traverse Failure!\n");
	}
	else
	{
		printf("Traverse Success!\n");
	}

	place = 4;
	ret = GetElem(list,place,&e);
	if(FAILURE == ret)
	{
		printf("Get %dth Failure!\n",place);
	}
	else
	{
		printf("%dth Element is %d\n",place,e);
	}

	ret = ListLength(list);
	printf("Length is %d\n",ret);

	ret = ListEmpty(list);
	if(TRUE == ret)
	{
		printf("List is Empty!\n");
	}
	else
	{
		printf("List is't Empty!\n");
	}

	place = 3;
	ret = ListDelete(list,place,&e);
	if(SUCCESS == ret)
	{
		printf("Delete %d Success!\n",e);
	}
	else
	{
		printf("Delete Failure!\n");
	}
	
	ret = ListTraverse(list,visit);
	if(FAILURE == ret)
	{
		printf("Traverse Failure!\n");
	}
	else
	{
		printf("Traverse Success!\n");
	}
	
/*	ret = ListClean(list);
	if(SUCCESS == ret)
	{
		printf("Clear Success!\n");
	}


	ret = ListLength(list);
	printf("Length is %d\n",ret);

	ret = ListDestroy(&list);
	if(SUCCESS == ret)
	{
		printf("Destroy Success!\n");
	}

	free(list);*/

	ret = ReverseList(list);
	if(ret == 1)
	{

 	ret = ListTraverse(list,visit);
	if(FAILURE == ret)
	{
		printf("Traverse Failure!\n");
	}
	else
	{
		printf("Traverse Success!\n");
	}
	}
	return 0;
}

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

int ListInit(LinkList *L)
{
	(*L) = (LinkList)malloc(sizeof(Node));
	if(NULL == (*L))
	{
		return FAILURE;
	}
	(*L)->next = NULL;

	return SUCCESS;
}

int ListInsert(LinkList *L,int i,ElemType e)
{
	LinkList p = *L;
	int j = 1;

	while(p!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}

	if(p==NULL||j>i)
	{
		return FAILURE;
	}

	LinkList n =(LinkList)malloc(sizeof(Node));
	if(NULL == n)
	{
		return FAILURE;
	}
	n->data = e;
	n->next = p->next;
	p->next = n;
}

int ListTraverse(LinkList l,void(*print)(ElemType))
{
	if(NULL == l)
	{
		return FAILURE;
	}
	LinkList p = l->next;

	while(p)
	{
		print(p->data);
		p = p->next;
	}
	return SUCCESS;
}

int GetElem(LinkList l, int k, ElemType *e)
{
	int length = 0;
	LinkList p = l->next;
	while(p)
	{
		length++;
		if(k == length)
		{
			break;
		}
		p = p->next;
	}

	if(k>length)
	{
		return FAILURE;
	}
	*e = p->data;

	return SUCCESS;
}

int ListLength(LinkList l)
{
	int length = 0;
	LinkList p = l->next;
	while(p)
	{
		p = p->next;
		length ++;
	}

	return length;

}

int ListEmpty(LinkList l)
{
	return (l->next == NULL)?TRUE:FALSE;
}

int ListDelete(LinkList l, int i,ElemType *e)
{
	LinkList p = l;
	int j = 1;
	LinkList tmp;

	while(p!=NULL&&j<i)
	{
		p = p->next;
		j++;
	}

	if(p == NULL || j>i)
	{
		return FAILURE;
	}

	tmp = p->next;
	p->next = tmp->next;
	free(tmp);

	return SUCCESS;
}

int ListClean(LinkList l)
{
	LinkList p = l;
	LinkList tmp;
	while(p->next)
	{
		tmp = p->next;
		p->next = tmp->next;
		free(tmp);
	}
	return SUCCESS;
}

int ListDestroy(LinkList *l)
{
	free(*l);
	*l=NULL;
	return SUCCESS;
}

int ReverseList(LinkList l)
{
	if(l == NULL)return 0;
	LinkList p = l->next;
	l->next = NULL;
	while(p != NULL)
	{
		LinkList q = p;
		p = p->next;
		q->next = l->next;
		l->next = q;
	}
	return 1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值