数据结构-----双向循环链表

瞎扯:白天被迫改一个重现都无法重现的错误.各种百度,各种测试,头发掉了一地,然鹅还是没解决出来 。所以晚上复习数据结构放松一下  

               

              DualCircleLinkList.h的代码(你也可以省略函数声明)

typedef  int status;
typedef  int ElemType;
typedef struct DualCircleLinkListNode
{   ElemType data;
    struct  DualCircleLinkListNode *next;
	struct  DualCircleLinkListNode *prior;
   
}DualCircleLinkListNode,*DualCircleLinkListList;
//定义链表的类
class  DualCircleLinkList
{   
public :
	DualCircleLinkList();//初始化类:一个类就代表着一个双向循环链表
	 DualCircleLinkList(ElemType data);
	 status InsertDualCircleLinkList(int index,ElemType data);//向链表中插入数据
      status DualCircleLinkListLength();//求其长度
		  status GetDualCircleLinkListElem(int index,ElemType &e);//获取特定位置上的数据
		     int DeleteDualCircleLinkListElem(int pos);//删除指定位置上的数据
			    int  PrintDualCircleLinkListData();
				void addData(int data);//直接在尾部插入数据
	DualCircleLinkListList head;//头指针
	DualCircleLinkListList cur;//当前指针
	int size;//链表大小	   
};

                                                    函数实现代码

#include<iostream>
#include"DualCircleLinkList.h"
using namespace std;
DualCircleLinkList::DualCircleLinkList()
{
		 head =new DualCircleLinkListNode[sizeof(DualCircleLinkListNode)];
		 head->prior=head->next=NULL;
		 cur=head;
	size = 0;
}//类的初始化函数
//DualCircleLinkList 代表类   
//DualCircleLinkListNode 代表 结点
//DualCircleLinkListList  代表结点指针
int DualCircleLinkList::DeleteDualCircleLinkListElem(int pos){//删除指定位置的数据
   //先检查数据的合法性
	if (size >= pos && pos > 0)
	{
		int count = 1;//计数
		DualCircleLinkListList temp = head;
		while (pos != count){
			temp = temp->next;//直到到达指定的位置
			count++;
	}
		//先到达指定位置
		if (size == pos)
		{
			if (1 == size)
			{//只有一个节点的时候
				delete []temp;
				head = cur;
				size--;
				return 0;
			}
			else
			{//删除最后一个节点
				cur = temp->prior;//向前移动一个位置
			}
		}
		else
		{
			if (1 == pos)
			{
				head = temp->next;//向后移动一个位置
			}
		}
		temp->prior->next = temp->next;
		temp->next = temp->prior;
		size--;//长度-1
		return 0;//成功返回0
	}
	return -1;//无数据或者越界返回-1
}
int DualCircleLinkList::InsertDualCircleLinkList(int pos, ElemType data){//在指定位置插入数据
	if (size >= pos && pos > 0)
	{//有数据并且没有越界才显示
		int count = 1;//计数
		DualCircleLinkListList dcl = new DualCircleLinkListNode[sizeof(DualCircleLinkListNode)];//结点的申请空间
	dcl->data = data;
	 	DualCircleLinkListList   temp = head;
		while (pos != count){
			temp = temp->next;//直到到达指定的位置
			count++;
		}
		//先到达指定位置
		//分情况是因为如果插入到第一个节点会改变head的状态
		if (size == pos)
		{
			if (1 == size)
			{
				head = dcl;
				head->next = temp;
				temp->prior = head;
				head->prior = temp;
				temp->next = head;
			}
			else
			{
				temp->prior->next = dcl;
				dcl->prior = temp->prior;
				dcl->next = temp;
				temp->prior = dcl;
			}
			size++;
			return 0;
		}
		else
		{
			if (1 == pos){
				head = dcl;
				head->next = temp;
				temp->prior  = head;
				head->prior = temp->prior;
				temp->prior->prior = head;
			}
			else
			{
				temp->prior->next = dcl;
				dcl->prior = temp->prior;
				dcl->next = temp;
				temp->prior = dcl;
			}
			size++;
			return 0;
		}
	}
	return -1;//越界返回-1
}
int DualCircleLinkList::GetDualCircleLinkListElem(int pos,int &e)
{//获得指定位置的数据
	if (size >= pos && pos > 0)
	{
		int count = 1;
		DualCircleLinkListList temp = head;
		while (pos != count){
			temp = temp->next;
			count++;
		}
		return temp->data;
	}
	return -1;//无数据或者越界返回-1
}
int DualCircleLinkList::DualCircleLinkListLength(){
	return size;
}


int   DualCircleLinkList::PrintDualCircleLinkListData()
{//打印链表
	if (NULL != head)
	{//链表非空
		DualCircleLinkListList temp = head;
		int count = 0;//计数
		while (size != count){
			std::cout<<temp->data<<"  ";
			temp = temp->next;
			count++;
		}
		return 0;
	}
	return -1;//空表返回-1
}
//如果头结点为空那么就为其开辟头结点,如果不为空那么就直接添加到链表的末尾
void DualCircleLinkList::addData(int data)
{
DualCircleLinkListList dcl =  new DualCircleLinkListNode[sizeof(DualCircleLinkListNode)];
	dcl->data = data;//所要添加的结点
	if (NULL != head->next)
	{//表非空
		DualCircleLinkListList temp = cur->next;
		cur->next = dcl;
		dcl->prior = cur;
		dcl->next = temp;
		temp->prior  = dcl;
	}
	 else {
		head = dcl;//新加节点成为头结点
		head->data = data;
		head->prior = head->prior = head;//指向自身
	}//已经添加完毕,新增节点成为当前节点
	cur = dcl;
	size++;//长度+1
}

                                            函数调用

#include<iostream>
#include"DualCircleLinkList.h"
//判断双向循环链表是否对称
status ifSymmetric(DualCircleLinkList test)
{
   DualCircleLinkListList p;
   p=test.head->next;
    DualCircleLinkListList q;
	q=test.head->prior;
	int i=1;
	 while(p==q&&i<=(test.DualCircleLinkListLength()/2))
	 {
       i++;
	   p=p->next;
	   q=q->prior;     
	 }
	 if(i==(test.DualCircleLinkListLength()/2))
	   return 1;
	 return 0;

}

int main()
{  //声明一个头结点
   DualCircleLinkList test;
   //向链表中添加一个数据
  test.addData(1);
  //在1的位置上插入9个数据
    for(int i=1;i<10;i++)
	{  
     if( test.InsertDualCircleLinkList(1,i)==0)
	  printf("添加成功!\n");
     else 
	  printf("添加失败!\n");
	}
	//打印当前的链表的长度
    printf("当前长度为%d\n",	test.DualCircleLinkListLength());
	//打印当前的链表的数据
	test.PrintDualCircleLinkListData();
   //删除数据
	test.DeleteDualCircleLinkListElem(1);
	 if(ifSymmetric(test)==1)
	 { printf("对称\n");
     
	 }
	 else 
	 {
		  printf("不对称\n");
	 }



}

  练习资源链接https://pan.baidu.com/s/1amVsZRvoV3bbyuM0XtgfgQ