循环链表_笔记
.h
typedef struct CIRCLELINKNODE {struct CIRCLELINKNODE* next;}CircleLinkNode;typedef struct CIRCLELINKLIST {CircleLinkNode head;int size;}CircleLinkList;//比較回調 typedef bool(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*); //打印回調 typedef void(*PRINTNODE)(CircleLinkNode*);class List { public:List();~List(); public:CircleLinkNode* linknode;CircleLinkList* linklist; public://插入void Insert_CircleLinkList(CircleLinkList* linklist,int pos,CircleLinkNode* data);//獲取第一個元素CircleLinkNode* Front_CircleLinkList(CircleLinkList* linklist);//根據位置刪除void RemoveByPos_CircleLinkList(CircleLinkList* linklist,int pos);//根據值刪除void RemoveByValue_CircleLinkList(CircleLinkList* linklist, CircleLinkNode* data, COMPARENODE compare);//獲取鏈表長度int Size_CircleLinkList(CircleLinkList* linklist);//判斷是否為空bool IsEmpty_CircleLinkList(CircleLinkList* linklist);//查找int Find_CircleLinkList(CircleLinkList* linklist,CircleLinkNode* data,COMPARENODE compare);//打印節點void Print_CircleLinkList(CircleLinkList* linklist, PRINTNODE print);};.cpp
List::List() {linklist = new CircleLinkList;linklist->head.next = &(linklist->head);linklist->size = 0;}List::~List() {if (linklist == NULL){return;}delete linklist;}//插入 void List::Insert_CircleLinkList(CircleLinkList* linklist, int pos, CircleLinkNode* data) {if (linklist == NULL || data == NULL){return;}if (pos<0 || pos>linklist->size){pos = linklist->size;}//根據位置查找節點CircleLinkNode* pCurrent = &(linklist->head);//輔助指針變量for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}//將新數據插入鏈表data->next = pCurrent->next;pCurrent->next = data;linklist->size++; }//獲取第一個元素 CircleLinkNode* List::Front_CircleLinkList(CircleLinkList* linklist) {return linklist->head.next; }//根據位置刪除 void List::RemoveByPos_CircleLinkList(CircleLinkList* linklist, int pos) {if (linklist == NULL){return;}if (pos< 0 || pos>=linklist->size){return;}//根據pos找節點CircleLinkNode* pCurrent = &(linklist->head);//輔助指針變量for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}//保存當前節點的下一個節點CircleLinkNode* pNext = pCurrent->next;pCurrent->next = pNext->next;linklist->size --; }//根據值刪除 void List::RemoveByValue_CircleLinkList(CircleLinkList* linklist, CircleLinkNode* data, COMPARENODE compare) {if (linklist == NULL || data == NULL){return;}//循環鏈表CircleLinkNode* pPrev = &(linklist->head);CircleLinkNode* pCurrent = pPrev->next;for (int i = 0; i < linklist->size; i++){if (compare(pCurrent,data) == true){pPrev->next = pCurrent->next;break;}pPrev = pCurrent;pCurrent = pCurrent->next;}linklist->size--; }//獲取鏈表長度 int List::Size_CircleLinkList(CircleLinkList* linklist) {return linklist->size; }//判斷是否為空 bool List::IsEmpty_CircleLinkList(CircleLinkList* linklist) {if (linklist->size == 0){return true;}return false; }//查找 int List::Find_CircleLinkList(CircleLinkList* linklist, CircleLinkNode* data, COMPARENODE compare) {if (linklist == NULL || data == NULL){return -1;}CircleLinkNode* pCurrent = linklist->head.next;int flag = -1;for (int i = 0; i < linklist->size; i++){if (compare(pCurrent,data) == true){flag = i;break;}pCurrent = pCurrent->next;}return flag; }//打印節點 void List::Print_CircleLinkList(CircleLinkList* linklist, PRINTNODE print) {if (linklist == NULL){return;}CircleLinkNode* pCurrent = linklist->head.next;for (int i = 0; i < linklist->size; i++){if (pCurrent == &linklist->head){pCurrent = pCurrent->next;cout << "----------------------------" << endl;}print(pCurrent);pCurrent = pCurrent->next;}}main.cpp
typedef struct PERSON {CircleLinkNode node;char name[64];int age;int score; }Person; //打印 void Myprintf(CircleLinkNode* data) {Person* p = (Person*)data;cout << "Name:" << p->name << " ";cout << "age:" << p->age << " ";cout << "score:" << p->score << " ";cout << endl;} //比較 bool MyCompare(CircleLinkNode* data1, CircleLinkNode* data2) {Person* p1 = (Person*)data1;Person* p2 = (Person*)data2;if (strcmp(p1->name,p2->name) == 0 && p1->age == p2->age && p1->score == p2->score){return true;}return false; }int main() {List *l = new List();//創建數據Person p1, p2, p3, p4, p5;strcpy(p1.name, "p1");strcpy(p2.name, "p2");strcpy(p3.name, "p3");strcpy(p4.name, "p4");strcpy(p5.name, "p5");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;p1.score = 100;p2.score = 200;p3.score = 300;p4.score = 400;p5.score = 500;//插入鏈表l->Insert_CircleLinkList(l->linklist, 100, (CircleLinkNode*)&p1);l->Insert_CircleLinkList(l->linklist, 100, (CircleLinkNode*)&p2);l->Insert_CircleLinkList(l->linklist, 100, (CircleLinkNode*)&p3);l->Insert_CircleLinkList(l->linklist, 100, (CircleLinkNode*)&p4);l->Insert_CircleLinkList(l->linklist, 100, (CircleLinkNode*)&p5);//打印l->Print_CircleLinkList(l->linklist, Myprintf);//根據值刪除Person pDel;strcpy(pDel.name,"p4");pDel.age = 40;pDel.score = 400;l->RemoveByValue_CircleLinkList(l->linklist,(CircleLinkNode*)&pDel,MyCompare);cout << "-------" << endl;l->Print_CircleLinkList(l->linklist,Myprintf);return 0; }總結