數據結構-----雙向循環鏈表

瞎扯:白天被迫改一個重現都無法重現的錯誤.各種百度,各種測試,頭髮掉了一地,然鵝還是沒解決出來 。所以晚上覆習數據結構放鬆一下  

               

              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