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();
    }
    
    

  • 相关阅读:
    java修改应用程序标题栏
    电动双轮车
    Oracle执行计划相关(待补充)
    SQL中IN和EXISTS用法的区别
    union all与union all
    equals与hashcode
    文件上传的整个流程
    adwords与adsence
    struts2文件上传大小
    为什么是UUID做主键
  • 原文地址:https://www.cnblogs.com/javafly/p/6037160.html
Copyright © 2011-2022 走看看