双向链表-C语言版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangqiang1363/article/details/41077385
源文件部分:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef int Elemtype;
#include"DList.h"
int main()
{
	Dlnode head=NULL;
	instruction(head);
	return 0;
}
头文件部分:
typedef struct DLnode
{
	Elemtype data;
	struct DLnode *prior;    ///节点的声明定义
	struct DLnode *next;
}DLnode,*Dlnode;

void Init_Dlist(Dlnode &arrow)    ///双向初始化
{
	arrow=(Dlnode)malloc(sizeof(DLnode));
	if(!arrow)
    {
        printf("对不起,已无更多的内存单元,初始化失败!\n");
        return ;
    }
	arrow->prior=NULL;
	arrow->next=NULL;
}

int Empty_Dlist(DLnode head)       ///双向判空
{
	if(head.next==NULL)
		return 1;
	return 0;
}

void Insert_Dlist(DLnode *head,Elemtype e)  ///尾插法-双向(新增)
{
	Dlnode p=NULL,q=head;
	p=(DLnode *)malloc(sizeof(DLnode));
	if(!p)
    {
        printf("对不起,已无更多的内存单元,申请内存失败!\n");
        return ;
    }
	while(q->next)
	{
		q=q->next;
	}
	p->data=e;
	p->next=NULL;
	p->prior=q;
	q->next=p;
}

int Length_Dlist(DLnode head)         ///双向的链长
{
	DLnode *p=NULL;
	int len=0;
	p=head.next;
	if(Empty_Dlist(head))
		return 0;
	while(p)
	{
		len++;
		p=p->next;
	}
	return len;
}

void Delete_Dlist(DLnode *head,Elemtype where)        ///双向按位置删除
{
	DLnode *p=NULL;
	int i=1;
	p=head->next;
	if(Empty_Dlist(*head))
	{
		printf("对不起,链表是空的,无法完成删除操作!!!\n");
		return ;
	}
	if(where>Length_Dlist(*head)||where<0)
	{
		printf("对不起,你删除的位置是不合法的,请重新输入!!!\n");
		return ;
	}
	while(i<where)
	{
		p=p->next;
		i++;
	}                                 //保证双向链表的完整性 
	p->prior->next=p->next;
	if(where!=Length_Dlist(*head)+1)
		p->next->prior=p->prior;
	printf("删除成功!!!\n");
	return ;
}

void Insearch_Dlist(DLnode head,Elemtype e)      ///双向按元素查找
{
	DLnode *p=NULL;
	int len=1;
	if(Empty_Dlist(head))
	{
		printf("对不起,链表是空的,无法完成查找操作!!!\n");
		return ;
	}
	p=head.next;
	while(p)
	{
		if(p->data==e)
		{
			printf("你要查找的元素位于链表的第%d位置上.\n",len);
			return ;
		}
		len++;
		p=p->next;
	}
	printf("对不起,你要查找的元素不存在,请重新输入!!!\n");
	return ;
}

void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e)      //双向按位置修改  
{
	DLnode *p=NULL;
	int len=1;
	if(Empty_Dlist(*head))
	{
		printf("对不起,链表是空的,无法完成修改操作!!!\n");
		return ;
	}
	p=head->next;
	if(where>Length_Dlist(*head)||where<0)        
	{
		printf("对不起,你修改的位置是不合法的,请重新输入!!!\n");
		return ;
	}
	while(len<where)
	{
		p=p->next;
		len++;
	}
	p->data=e;
	printf("修改成功!\n");
	return ;
}

void Print_Dlist(Dlnode head)          //双向的打印 
{
	Dlnode p=head->next;
	if(p==NULL)
	{
		printf("对不起,当前链表已空,无法完成打印操作!!!\n");
		return ;
	}
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
	return ;
}

void Destory_Dlist(Dlnode head)            //双向的销毁-不包括头节点  
{
	Dlnode p=head,q=NULL;
	while(p->next)
	{
		p=p->next;
	}
	while(p!=head)
	{
		p->prior->next=NULL;
		q=p;
		p=p->prior;	
		free(q);
	}
	printf("销毁成功!!!\n");
}

void instruction(Dlnode head)
{
	int n,m,t,a,b,len1,index;
	printf("\t\t1、初始操作\n");
	printf("\t\t2、新增操作\n");              //为什么不能在这里定义head指针---因为每次调用功能函数后,head指针又被重新初始化了    
	printf("\t\t3、删除操作\n");
	printf("\t\t4、查找操作\n");
	printf("\t\t5、修改操作\n");
	printf("\t\t6、销毁操作\n");
	printf("\t\t7、求长操作\n");
	printf("\t\t8、打印操作\n");
	printf("\t\t9、退出程序\n");
	printf("请输入你所需要完成的指令:\n");
	do{
		scanf("%d",&n);
		if(n<1||n>9)
			printf("对不起,你输入的指令编号是无效的,请重新输入!!!\n");
	}while(n<1||n>9);
	switch(n)
	{
		case 1:
			Init_Dlist(head);            //初始化操作
			printf("已完成双向链表初始化,请输入你要添加的元素个数!\n");
			scanf("%d",&n);
			while(n--)
			{
				int x;
				scanf("%d",&x);
				Insert_Dlist(head,x);
			}
			printf("完成建表操作!\n");
			break;
		case 2:                                  //新增操作
			if(!head)
			{
				printf("对不起,请先完成初始化操作再做该选择!!!\n");
				break;
			}
			printf("请输入你要添加的元素个数!\n");
			scanf("%d",&n);
			while(n--)
			{
				int x;
				scanf("%d",&x);
				Insert_Dlist(head,x);
			}
			printf("增添成功!\n");
			break;
		case 3:
			printf("请输入你所要删除的节点的位置:\n");
			scanf("%d",&n);
			Delete_Dlist(head,n);                             //删除操作
			break;
		case 4:
			printf("请输入你所要查找的元素:\n");
			scanf("%d",&m);
			Insearch_Dlist(*head,m);                       //查找操作 
			break;
		case 5:
			printf("请输入你更改的元素队列位置:\n");          //修改操作 
			do{
				scanf("%d",&a);
				if(a<1||a>Length_Dlist(*head))
					printf("对不起,你所输入的元素位置不在区域内,请重新输入!!!\n");
			}while(a<1||a>Length_Dlist(*head));
			printf("请输入修改后的值:\n");
			scanf("%d",&b);
			Modify_Dlist(head,a,b);
			break;
		case 6:
			Destory_Dlist(head);            //销毁操作 
			break;
		case 7:
			len1=Length_Dlist(*head);             //返回链长操作 
			printf("当前链队列的长度为:%d\n",len1);
			break;
		case 8:
			Print_Dlist(head);        //打印操作 
			break;
		case 9:                   //退出操作 
			return;
		default:
			instruction(head);
			break;
	}
	instruction(head);
}

猜你喜欢

转载自blog.csdn.net/huangqiang1363/article/details/41077385