建立双向循环链表,反方向输出数据

建立双向循环链表 反方向输出数据

题目

请写一算法,该算法的功能是先通过键盘输入n个整型数据,建一个带头结点的双向循环链表,然后按照输入相反的次序依次输出这n个整型数据。

示例

假设输入:【1,2,3,4,5】
则输出为:【5,4,3,2,1】

分析

第一步: 建立循环链表
第二步:遍历循环链表

代码

第一种方法

建立一个双向链表,然后在最后的头尾相连,构成循环链表。

// 建立双向循环链表  反方向输出数据
DLinklist CREATEDLIN(int n){    
	DLinklist list=NULL,p,q;    
	list=(DLinklist)malloc(sizeof(DNode));    
	list->llink=NULL;   
	 list->rlink=NULL;    
	 q=list;    
	 printf("input Start\n");    
	 for (int i = 1; i <=n; i++)    {         
		 p=(DLinklist)malloc(sizeof(DNode));         
	 	 scanf("%d",&(p->data));         
	 	 p->rlink=NULL;        
	 	 p->llink=q;         
	  	 q->rlink=p;        
	   	 q=p;    
	 }
           list->llink=p;    
           p->rlink=list; // 头尾相连,构成循环链表        
           q=list->llink;     // 反向遍历
           while (q!=list)    {        
           	printf("%d,",q->data);        
          	 q=q->llink;    
          } 
          return list;       
   }

第二种

反向建立循环链表,每次创建一个结点,插入到list的后继结点位置,遍历时,直接正方向遍历。

DLinklist CREATEDLIN2(int n){       
	DLinklist list=NULL,p;    
	list=(DLinklist)malloc(sizeof(DNode));    
	list->llink=list;    
	list->rlink=list;   
        printf("input Start\n");    
        for (int i = 1; i <=n; i++)    {       
		p=(DLinklist)malloc(sizeof(DNode));        
         	scanf("%d",&(p->data));        
          	p->llink=list;         
          	p->rlink=list->rlink;         
          	list->rlink->llink=p;         
         	list->rlink=p;    // 插入到list的后继结点
         }    
         p=list->rlink;   // 遍历 
         while (p!=list)    {        
         	printf("%d,",p->data);        
         	p=p->rlink;    
        }   
        return list;   
   }

你可能感兴趣的:(数据结构)