首页 > 其他 > 详细

双链表的基本运算

时间:2014-03-17 00:44:27      阅读:387      评论:0      收藏:0      [点我收藏+]

代码:

#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct DNode
{
	ElemType data;
	struct DNode *prior;
	struct DNode *next;
}DLinkList;
//初始化
void InitList(DLinkList * &L)
{
	L=(DLinkList *)malloc(sizeof(DLinkList));
	L->prior=L->next=NULL;
}
//销毁双链表
void DestroyList(DLinkList *L)
{
	DLinkList *p=L,*q=p->next;
	while(q!=NULL)
	{
		free(p);
		p=q;
		q=p->next;
	}
	free(p);
}
//判断链表是否为空
bool ListEmpty(DLinkList *L)
{
	return(L->next==NULL);
}
//双链表的长度
int ListLength(DLinkList *L)
{
	DLinkList *p=L;
	int i=0;
	while(p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
}
//输出双链表
void DispList(DLinkList *L)
{
	DLinkList *p=L->next;
	while(p!=NULL)
	{
		printf(" %c ",p->data);
		p=p->next;
	}
	printf("\n");
}
//求双链表中的某个元素的值
bool GetElem(DLinkList *L,int i,ElemType &e)
{
	int j=0;
	DLinkList *p=L;
	while(j<i && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		e=p->data;
		return true;
	}
    
}
//按元素值查找
int LocateElem(DLinkList *L,ElemType e)
{
	int n=1;
	DLinkList *p=L->next;
	while(p!=NULL && p->data!=e)
	{
		n++;
		p=p->next;
	}
	if(p==NULL)
		return 0;
	else
		return n;
}
//插入元素
bool ListInsert(DLinkList * &L,int i,ElemType e)
{
	int j=0;
	DLinkList *p=L,*s;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		s=(DLinkList *)malloc(sizeof(DLinkList));
		s->data=e;
		s->next=p->next;
		if(p->next!=NULL)
			p->next->prior=s;
		s->prior=p;
		p->next=s;
		return true;
	}
}
//删除数据元素
bool ListDelete(DLinkList * &L,int i,ElemType &e)
{
	int j=0;
	DLinkList *p=L,*q;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		q=p->next;
		if(q==NULL)
			return false;
		e=q->data;
		p->next=q->next;
		if(p->next!=NULL)
			p->next->prior=p;
		free(q);
		return true;
	}
}
void main()
{
	DLinkList *h;
	ElemType e;
	printf("双链表的基本运算如下:\n");
	printf(" (1)初始化双链表h\n");
	InitList(h);
	printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(h,1,‘a‘);
	ListInsert(h,2,‘b‘);
	ListInsert(h,3,‘c‘);
	ListInsert(h,4,‘d‘);
	ListInsert(h,5,‘e‘);
	printf(" (3)输出双链表h:");
	DispList(h);
	printf(" (4)双链表的长度=%d\n",ListLength(h));
	printf(" (5)双链表h为%s\n",(ListLength(h)?"空":"非空"));
	GetElem(h,3,e);
	printf(" (6)双链表h的第三个元素=%c\n",e);
	printf(" (7)元素a的位置=%d\n",LocateElem(h,‘a‘));
	printf(" (8)在第四个元素上插入f元素\n");
	ListInsert(h,4,‘f‘);
	printf(" (9)输出双链表h:");
	DispList(h);
	printf(" (10)删除h的第三个元素\n");
	ListDelete(h,3,e);
	printf(" (11)输出双链表h:");
	DispList(h);
	printf(" (12)释放双链表h\n");
	DestroyList(h);
}

运行结果:

bubuko.com,布布扣

双链表的基本运算,布布扣,bubuko.com

双链表的基本运算

原文:http://blog.csdn.net/u010286751/article/details/21343439

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!