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