数据结构一:链表(循环链表)
生活随笔
收集整理的這篇文章主要介紹了
数据结构一:链表(循环链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:實現機制
Linux鏈表實現思想就是:結點里面只創建一個next指針,用指針將各個結點相連接 打印和查找的時候,再進行類型的轉換。
循環鏈表在Linux鏈表的基礎上改動,最后結點的next指向的是開始頭結點,而Linux鏈表最后結點的next指向的是NULL;循環鏈表在在初始化時,頭結點指向它本身(clist->head.next=&(clist->head);)
二:代碼
1 CircleLinkList.h
/* CircleLinkList.h 實現機制為linux鏈表(企業鏈表) */ #ifndef _CIRCLELINKLIST_H_ #define _CIRCLELINKLIST_H_ #include <stdio.h> #include <stdlib.h>#define CIRCLELINKLIST_TRUE 0 #define CIRCLELINKLIST_FALSE -1//創建小節點 typedef struct CIRCLELINKNODE{struct CIRCLELINKNODE *next; }CircleLinkNode; //鏈表 typedef struct CIRCLELINKLIST{CircleLinkNode head;//head頭結點,是結構體 int size;//鏈表數據個數 }CircleLinkList; //值刪除回調函數 typedef int (*COMPARE)(CircleLinkNode *data1,CircleLinkNode *data2); //打印回調函數 typedef void (*PRINT)(CircleLinkNode *data);//初始化 CircleLinkList *_Init_List(); //插入 void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data); //按照位置刪除 void _DeleteByPos_List(CircleLinkList *clist,int pos); //按照值刪除 void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare); //返回第一個數據 CircleLinkNode *_Front_List(CircleLinkList *clist); //獲得鏈表長度 int _Size_List(CircleLinkList *clist); //打印 void _Print_List(CircleLinkList *clist,PRINT my_Print); //查找 int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare); //釋放內存 void _Free_List(CircleLinkList *clist); #endif2 CircleLinkList.c
/* CircleLinkList.c */ #include "CircleLinkList.h"//初始化 CircleLinkList *_Init_List(){CircleLinkList *clist=(CircleLinkList *)malloc(sizeof(CircleLinkList));clist->head.next=&(clist->head);clist->size=0;return clist; } //插入 void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data){if(clist==NULL){return ;}if(pos<0||pos>clist->size){pos=clist->size;//默認往尾部插 }CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//尋找前一結點 pCurrent=pCurrent->next; }//插入數據data->next=pCurrent->next;pCurrent->next=data;clist->size++; }//打印 void _Print_List(CircleLinkList *clist,PRINT my_Print){if(clist==NULL){return ;}CircleLinkNode *pCurrent=(clist->head.next);for(int i=0;i<clist->size;i++){if(pCurrent==&(clist->head)){//如果打印多次,跳過頭指針 pCurrent=pCurrent->next; }//打印my_Print(pCurrent);pCurrent=pCurrent->next; } } //按照位置刪除 void _DeleteByPos_List(CircleLinkList *clist,int pos){if(clist==NULL){return ;}if(pos<0||pos>=clist->size){return ;}CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//尋找前一結點 pCurrent=pCurrent->next; }//將這個要刪除結點緩存CircleLinkNode *DelNode= pCurrent->next;pCurrent->next=DelNode->next;//釋放刪除結點空間,/*if(DelNode!=NULL){free(DelNode);DelNode=NULL;} */clist->size--; } //按照值刪除 void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return ;}if(data==NULL){return ;}CircleLinkNode *PreCurrent= &(clist->head);//數據的前一個 CircleLinkNode *pCurrent=PreCurrent->next;//查找到相對應的數據 for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//匹配成功 PreCurrent->next=pCurrent->next;clist->size--;break;}//沒有匹配到,定義前后指針注意//PreCurrent->next= pCurrent;//pCurrent->next=PreCurrent->next; PreCurrent=pCurrent;pCurrent=PreCurrent->next;}} //返回第一個數據 CircleLinkNode *_Front_List(CircleLinkList *clist){return clist->head.next; } //獲得鏈表長度 int _Size_List(CircleLinkList *clist){return clist->size; } //查找 int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return -1;}if(data==NULL){return -1;}CircleLinkNode *pCurrent=(clist->head.next);int pos=-1;for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//找到了 pos=i;break;}pCurrent=pCurrent->next;}return pos; } //釋放內存 void _Free_List(CircleLinkList *clist){if(clist!=NULL){free(clist);clist=NULL;} }3 main.c
/* main.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "CircleLinkList.h"typedef struct PERSON{CircleLinkNode node;char name[64];int age; }Person;//打印回調 void my_Print(CircleLinkNode *data){Person *p=(Person*)data;printf("name:%s age:%d\n",p->name,p->age); } //比較回調 int my_Compare(CircleLinkNode *data1,CircleLinkNode *data2){Person *p1=(Person*)data1;Person *p2=(Person*)data2;//判斷if(strcmp(p1->name,p2->name)==CIRCLELINKLIST_TRUE&&p1->age==p2->age) {return CIRCLELINKLIST_TRUE;}else{return CIRCLELINKLIST_FALSE;} } int main(void){ //初始化CircleLinkList *clist=_Init_List();//創建數據Person p1,p2,p3,p4;strcpy(p1.name,"AAA"); strcpy(p2.name,"BBB"); strcpy(p3.name,"CCC"); strcpy(p4.name,"DDD"); p1.age=20; p2.age=30;p3.age=40;p4.age=50;//插入_Insert_List(clist,0,(CircleLinkNode*)&p1);_Insert_List(clist,1,(CircleLinkNode*)&p2);_Insert_List(clist,2,(CircleLinkNode*)&p3);_Insert_List(clist,3,(CircleLinkNode*)&p4);//打印_Print_List(clist,my_Print);//查找Person p6;strcpy(p6.name,"BBB"); p6.age=60;int pos=_Find_List(clist,(CircleLinkNode*)&p6,my_Compare);//p6換為p2就可以找到 if(pos==-1){printf("p2 not found\n");}else{printf("p2 found pos=%d\n",pos);}//按照值刪除printf("*********value delete***********\n");_DeleteByValue_List(clist,(CircleLinkNode*)&p2,my_Compare);_Print_List(clist,my_Print);//按照位置刪除printf("*********pos delete***********\n");_DeleteByPos_List(clist,1);_Print_List(clist,my_Print);printf("List length:%d\n",_Size_List(clist));//釋放內存_Free_List(clist);return 0; }三:結果顯示
1.編譯環境
centos 3.10.0-862.el7.x86_64 gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)2.編譯命令
gcc main.c CircleLinkList.c -std=c99 ./a.out3.結果顯示
總結
以上是生活随笔為你收集整理的数据结构一:链表(循环链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构一:链表(linux链表)
- 下一篇: 数据结构一:链表(约瑟夫问题)