zoukankan      html  css  js  c++  java
  • _DataStructure_C_Impl:双向链表

    //双向链表
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef char DataType;
    typedef struct Node{
    	DataType data;
    	struct Node *prior;
    	struct Node *next;
    }DListNode,*DLinkList;
    //初始化双向循环链表
    int InitDList(DLinkList *head){  //head 是二级指针
    	*head=(DLinkList)malloc(sizeof(DListNode));
    	if(!head)
    		return -1;
    	(*head)->next=*head;	//使头结点的prior指针和next指针指向自己
    	(*head)->prior=*head;
    	return 1;
    }
    //创建双向循环链表
    int CreateDList(DLinkList head,int n){
    	DListNode *p,*q;
    	int i;
    	char e;
    	q=head;
    	for(i=1;i<=n;i++){
    		printf("input %d data:",i);
    		e=getchar();
    		p=(DLinkList)malloc(sizeof(DListNode));
    		p->data=e;
    		//将新生成的结点插入到双向循环链表
    		p->next=q->next;
    		q->next=p;
    		p->prior=q;
    		head->prior=p;	//这里要注意头结点的prior指向新插入的结点
    		q=p;		//q始终指向最后一个结点
    		getchar();
    	}
    	return 1;
    }
    //查找插入的位置,找到返回该结点的指针,否则返回NULL
    DListNode *GetElem(DLinkList head,int i){
    	DListNode *p;
    	int j;
    	p=head->next;
    	j=1;
    	while(p!=head&&j<i){
    		p=p->next;
    		j++;
    	}
    	if(p==head||j>i)	//如果要位置不正确,返回NULL
    		return NULL;
    	return p;
    }
    //在双向循环链表的第i个位置插入元素e。插入成功返回1,否则返回0
    int InsertDList(DLinkList head,int i,char e){
    	DListNode *p,*s;
    	p=GetElem(head,i);	//查找链表中第i个结点
    	if(!p)
    		return 0;
    	s=(DListNode *)malloc(sizeof(DListNode));
    	if(!s)
    		return -1;
    	s->data=e;
    	//将s结点插入到双向循环链表
    	s->prior=p->prior;
    	p->prior->next=s;
    	s->next=p;
    	p->prior=s;
    	return 1;
    }
    //输出双向循环链表中的每一个元素
    void PrintDList(DLinkList head){
    	DListNode *p;
    	p=head->next;
    	while(p!=head){
    		printf("%c ",p->data);
    		p=p->next;
    	}
    	printf("
    ");
    }
    void main_DLinkList(){
    	DLinkList h;
    	int n;
    	int pos;
    	char e;
    	InitDList(&h);
    	printf("输入元素个数:");
    	scanf("%d",&n);
    	getchar();//接收换行
    	CreateDList(h,n);
    	printf("链表中的元素:");
    	PrintDList(h);
    	printf("请输入插入的元素及位置:");
    	scanf("%c",&e);
    	getchar();
    	scanf("%d",&pos);
    	InsertDList(h,pos,e);
    	printf("插入元素后链表中的元素:");
    	PrintDList(h);
    	system("pause");
    }
    //**************************************************
    void MergeDLink(DLinkList A,DLinkList B){
    	DListNode *p,*q,*r,*qt,*pt;
    	p=A->next;
    	q=B->next;
    	A->prior=A->next=A;
    	r=A;
    	while(p!=A&&q!=B){
    		if(p->data<=q->data){
    			pt=p->next;
    			p->next=r->next;
    			p->prior=r;
    			r->next->prior=p;
    			r->next=p;
    			r=p;
    			p=pt;
    		}else{
    			qt=q->next;
    			q->next=r->next;
    			q->prior=r;
    			r->next->prior=q;
    			r->next=q;
    			r=q;
    			q=qt;
    		}
    	}
    	if(p!=A){
    		r->next=p;
    		p->prior=r;
    	}else if(q!=B){
    		r->next=q;
    		q->prior=r;
    		B->prior->next=A;
    		A->prior=B->prior;
    	}
    	free(B);
    }
    void main_MergeDLink(){
    	DLinkList A,B;
    	int n;
    	int pos;
    	char e;
    	InitDList(&A);
    	printf("请输入链表A的元素个数:");
    	scanf("%d",&n);
    	getchar();//接收换行
    	CreateDList(A,n);
    	printf("链表A中的元素:");
    	PrintDList(A);
    	InitDList(&B);
    	printf("请输入链表B的元素个数:");
    	scanf("%d",&n);
    	getchar();//接收换行
    	CreateDList(B,n);
    	printf("链表B中的元素:");
    	PrintDList(B);
    	MergeDLink(A,B);
    	printf("链表A和B合并后的元素:");
    	PrintDList(A);	
    	system("pause");
    }
    void main(){
    	main_DLinkList();
    	main_MergeDLink();
    }
    
    

  • 相关阅读:
    ASP.NET Core 中间件的使用(二):依赖注入的使用
    ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
    附029.Kubernetes安全之网络策略
    C# 9.0中引入的新特性init和record的使用思考
    拥抱云原生,如何将开源项目用k8s部署?
    Angular实战之使用NG-ZORRO创建一个企业级中后台框架(进阶篇)
    Angular实战之使用NG-ZORRO创建一个企业级中后台框架(入门篇)
    Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目
    (已解决)'ng' 不是内部或外部命令,也不是可运行的程序或批处理文件
    如何免费扩展谷歌网盘的容量
  • 原文地址:https://www.cnblogs.com/javafly/p/6037160.html
Copyright © 2011-2022 走看看