数据结构2——链表

本文探讨了循环链表的概念,包括其首尾相接的特点和如何从任意节点遍历链表。文章还介绍了判断循环链表尾结点的方法,如q->next==first,并讨论了头插法和尾插法的实现。此外,内容涵盖了如何将非循环单链表转化为循环链表以及双链表的处理原则。最后,文章通过一元多项式的相加例子展示了循环链表在计算中的应用。
摘要由CSDN通过智能技术生成

循环链表

特点:

首尾相接的链表。

可以从任一节点出发,访问链表中的所有节点。

判断循环链表中尾结点的特点:

                   q->next==first

头插法

template <class T>  
CycleLinkList<T>:: CycleLinkList(T a[ ], int n,int k)
 {
    first=new Node<T>;   //生成头结点
	first->next=first;
	Node<T> *s;
	for (int i=1; i<n; i++)
	{ 
      s=new Node<T>; 
	  s->data=a[i];  //为每个数组元素建立一个结点
      s->next=first->next;
	  first->next=s;
	}
}

尾插法

template <class T>  
CycleLinkList<T>:: CycleLinkList(T a[ ], int n) {
    first=new Node<T>;   //生成头结点
	Node<T> *r,*s;
     r=first;          //尾指针初始化
    for (int i=0; i<n; i++)	{ 
        s=new Node<T>; 
        s->data=a[i];  
        r->next=s; 
         r=s;     
	}
    r->next=first;    //单链表建立完毕,将终端结点的指针域指向头结点
 }

非循环的单链表改造成循环的单链表

p=first;
while(p->next)
{ 
       p=p->next;  
 }
p->next=first

双链表

处理原则:先处理每个方向的 远端指针,再处理近端指针

头插法

template <class T>
void DoubleLink<T>::Append(T data){
	      Node<T> *s;
     	s=new Node<T>;
	       s->data=data;
		s->rlink=head->rlink;
		head->rlink=s;
		s->llink=head;
		if (s->rlink)
			s->rlink->llink=s;
		return;
}

插入位置在尾结点是要特别注意

q->rlink=p->rlink;
P->rlink=q;
q->llink=p;
if(q->rlink)
q->rlink->llink=q;

一元多项式的相加

三个指针以一条已知链作为基链将另一条连上的数据计算并合并到这条链上实现一元多项式相加

while ( pa != NULL && pb != NULL ) {
       a = pa->data;  b = pb->data;
       if(a.exp==b.exp){ 		//pa->exp == pb->exp
	   a.coef = a.coef + b.coef;	//系数相加
            p = pb;  pb = pb->next;  
            delete p;		//删去原pb所指结点
	if ( a.coef == 0) {
                   p = pa;  pa = pa->next;  delete p;
            }	                 //相加为零, 该项不要
            else {              //相加不为零, 加入ch链
                   pa->data = a;   pc->next = pa;
                   pc = pa;  pa = pa->next;
             }
        }
       else if(a.exp>b.exp) {	  //pa->exp > pb->exp
	  pc->next = pb;  pc = pb;  
               pb = pb->next;
	}
       else{		  //pa->exp < pb->exp
	 pc->next=pa;  
              pc = pa;  pa = pa->next;
      }
   }
if (pa ) pc->next=pa;
ese pc->next=pb; 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值