双链表(C语言实现)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType; 
typedef struct Node
{
	DataType data;
	struct Node * next;
	struct Node * prior;
	
}LinkList;

LinkList * Init_List();									//	初始化链表 
bool Creat_List(LinkList * L);							//	创建链表 
int Length_List(LinkList * L);							//	链表长度 
bool Insert_List(LinkList * L, int pos, DataType x);	//	插入结点	
bool Delete_List(LinkList * L, int pos, DataType * x);	//	删除结点 
void Traverse_List(LinkList * L);						//	遍历链表 

int main()
{
	DataType x;
	LinkList * L = NULL;
	
	if(L = Init_List())
		printf("双链表初始化成功!\n");
	else
		printf("双链表初始化失败!\n");
	
	if(Creat_List(L))
		printf("双链表创建成功!\n");
	else
		printf("双链表创建失败!\n");
	printf("遍历双链表:");
	Traverse_List(L);
	printf("双链表长度:%d\n\n",Length_List(L)); 
	
	if(Insert_List(L,4,6))
	{
		printf("插入成功!\n");
		printf("插入结点:第4个结点\n");
		printf("插入元素:6\n");
	}
	else
		printf("元素插入失败!\n");
	printf("遍历双链表:");
	Traverse_List(L);
	
	if(Delete_List(L,3,&x))
	{
		printf("删除成功!\n");
		printf("删除结点:第3个结点\n"); 
		printf("删除元素:%d\n",x); 
	} 
	else
	printf("元素删除失败!\n");
	printf("遍历双链表:");
	Traverse_List(L);
	
} 

LinkList * Init_List()
{
	LinkList * L = (LinkList*)malloc(sizeof(LinkList));	//	创建头结点并返回头结点的地址
	if(!L)
	{
		printf("申请空间失败!\n");
		exit(-1);	
	} 
	
	L->prior = L->next = NULL;
	return L;
}

bool Creat_List(LinkList *L)
{
	int i,n,val;
	LinkList * Tail = L;
	
	printf("请输入双链表结点的个数:");
	scanf("%d",&n);
	for(i = 0; i<n; ++i)
	{
		printf("第%d个结点:", i+1);
		scanf("%d",&val);
		LinkList * p = (LinkList*)malloc(sizeof(LinkList));
		if(!p)
		{
			printf("申请空间失败!\n");
			exit(-1);
		}
		p->data = val;
		p->prior = Tail->next;
		Tail->next = p;
		p->next = NULL;
		Tail = p;
	}
	
	return true;
}

int Length_List(LinkList * L)
{
	int cnt = 0;
	LinkList * p = L->next;
	
	while(p!=NULL)
	{
		cnt++;
		p = p->next;
	}
	
	return cnt;
}

bool Insert_List(LinkList * L, int pos, DataType x)
{
	int i = 1;
	LinkList * p = L->next;
	
	if(pos<1||pos>Length_List(L))
		return false;
		
	while(i<pos-1&&p)
	{
		i++;
		p = p->next;	//	p指向被插入结点的前一个结点 
	}
	
	if(p)	
	{
		LinkList * q = (LinkList*)malloc(sizeof(LinkList));
		if(!q)
		{
		 	printf("申请空间失败!\n");
			exit(-1); 
		}
		q->data = x;
		q->next = p->next;
		q->prior = p;
		p->next->prior = q;
		p->next = q;
		return true;
	
	}
	else
		return false;
}

bool Delete_List(LinkList * L, int pos, DataType * x)
{
	int i = 1;
	LinkList * p = L->next;
	
	if(pos<1||pos>Length_List(L))
		return false;
		
	while(i<pos-1&&p)
	{
	 	i++;
		p = p->next; 
	}
	
	if(p)
	{
		LinkList * q = p->next;
		*x = q->data;
		p->next = q->next;
		q->next->prior = p;
		free(q);
		return true;
	}
	else
		return false;
}

void Traverse_List(LinkList * L)
{
	LinkList *  p = L->next;
	
	while(p!=NULL)
	{
		printf("%3d",p->data);
		p = p->next;
	}
	
	printf("\n\n");
}

 

猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/121048318