資料結構-----雙向迴圈連結串列
阿新 • • 發佈:2018-12-15
瞎扯:白天被迫改一個重現都無法重現的錯誤.各種百度,各種測試,頭髮掉了一地,然鵝還是沒解決出來 。所以晚上覆習資料結構放鬆一下
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"); } }