1. 程式人生 > >資料結構-----雙向迴圈連結串列

資料結構-----雙向迴圈連結串列

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

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



}