数据结构一:链表(linux链表)
生活随笔
收集整理的這篇文章主要介紹了
数据结构一:链表(linux链表)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:實(shí)現(xiàn)機(jī)制
linux鏈表實(shí)現(xiàn)思想就是:結(jié)點(diǎn)里面只創(chuàng)建一個(gè)next指針,用指針將各個(gè)結(jié)點(diǎn)相連接 打印和查找的時(shí)候,再進(jìn)行類型的轉(zhuǎn)換
二:代碼
1 LinkList.h
/* LinkList.h linux鏈表實(shí)現(xiàn)思想就是:結(jié)點(diǎn)里面只創(chuàng)建一個(gè)next指針,用指針將各個(gè)結(jié)點(diǎn)相連接 打印和查找的時(shí)候,在進(jìn)行類型的轉(zhuǎn)換 */ #ifndef _LINKLIST_H_ #define _LINKLIST_H_ #include<stdlib.h> #include<stdio.h>//鏈表小結(jié)點(diǎn) 和普通鏈表相比較 沒(méi)有數(shù)據(jù)域 只有next指針 typedef struct LINNODE{struct LINNODE *next; }Link_Node; //鏈表,有頭結(jié)點(diǎn)和長(zhǎng)度 typedef struct LINKLIST{Link_Node head;// Link_Node的結(jié)構(gòu)體,而不是結(jié)構(gòu)體指針 int size;//結(jié)點(diǎn)個(gè)數(shù) }Link_List; //查找回調(diào)函數(shù) typedef int (*FIND)(Link_Node *data1,Link_Node *data2); //打印回調(diào)函數(shù) typedef void (*PRINT)(Link_Node *data);//初始化 Link_List *_Init_(); //插入 void _Insert(Link_List *list,int pos,Link_Node *data);//插入的是Link_Node的指針 //刪除 void _Delete(Link_List *list,int pos); //查找 int _Find(Link_List *list,Link_Node *data,FIND my_Find); //打印 void _Print(Link_List *list,PRINT my_Print); //結(jié)點(diǎn)個(gè)數(shù)size int _Size(Link_List *list); //釋放內(nèi)存 void _Free(Link_List *list);#endif2 LinkList.c
/* LinkList.c */ #include "LinkList.h"//初始化 Link_List *_Init_(){Link_List *list=(Link_List*)malloc(sizeof(Link_List));list->head.next=NULL;list->size=0;return list; } //插入 void _Insert(Link_List *list,int pos,Link_Node *data){//插入的是Link_Node的指針Link_Node *Current_Node=&(list->head);for(int i=0;i<pos;i++){//查找插入位置的前一個(gè)結(jié)點(diǎn) Current_Node=Current_Node->next; }//插入data->next=Current_Node->next;Current_Node->next=data;list->size++; } //刪除 void _Delete(Link_List *list,int pos){Link_Node *Current_Node=&(list->head);for(int i=0;i<pos;i++){//查找插入位置的前一個(gè)結(jié)點(diǎn) Current_Node=Current_Node->next; }Current_Node->next=Current_Node->next->next; list->size--; }//查找 int _Find(Link_List *list,Link_Node *data,FIND my_Find){Link_Node *Current_Node=&(list->head);int pos=-1;int flag=-1;while(Current_Node!=NULL){if(my_Find(Current_Node,data)==0){//查找到了 //pos=flag;return flag;break;}flag++;Current_Node=Current_Node->next;}return flag; } //打印 void _Print(Link_List *list,PRINT my_Print){//打印頭結(jié)點(diǎn)不需要考慮for(Link_Node *Current_Node=list->head.next;Current_Node!=NULL;Current_Node=Current_Node->next){my_Print(Current_Node);} } //結(jié)點(diǎn)個(gè)數(shù)size int _Size(Link_List *list){return list->size; } //釋放內(nèi)存 void _Free(Link_List *list){if(list!=NULL){free(list);list=NULL;} }3 main.c
/* main.c linux鏈表實(shí)現(xiàn)思想就是:結(jié)點(diǎn)里面只創(chuàng)建一個(gè)next指針,用指針將各個(gè)結(jié)點(diǎn)相連接 打印和查找的時(shí)候,在進(jìn)行類型的轉(zhuǎn)換 */ #include "LinkList.h" #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct PERSON{Link_Node node;char name[64];int age; }Person;//打印回調(diào) void my_Print(Link_Node *data){Person *p=(Person *)data;//數(shù)據(jù)類型的轉(zhuǎn)換printf("name:%s age:%d\n",p->name,p->age); }//回調(diào)查找 int my_Find(Link_Node *data1,Link_Node *data2){//數(shù)據(jù)類型轉(zhuǎn)換Person *p1=(Person *)data1;Person *p2=(Person *)data2;if(strcmp(p1->name,p2->name)==0&&p1->age==p2->age){return 0;}else{return -1;}} int main(void){//初始化Link_List *list=_Init_();//實(shí)例產(chǎn)生數(shù)據(jù)Person p1,p2,p3,p4;strcpy(p1.name,"AAA");strcpy(p2.name,"BBB");strcpy(p3.name,"CCC");strcpy(p4.name,"DDD");p1.age=10;p2.age=20;p3.age=30;p4.age=40;//插入printf("********insert**********\n");_Insert(list,0,(Link_Node*)&p1);_Insert(list,1,(Link_Node*)&p2);_Insert(list,2,(Link_Node*)&p3);_Insert(list,3,(Link_Node*)&p4);//打印_Print(list,my_Print);//查找printf("********my_Find**********\n");int pos=_Find(list,(Link_Node*)&p2,my_Find);//int pos=_Find(list,&p2,my_Find);if(pos==-1){printf("p2 not found\n");}else{printf("p2 found pos=%d\n",pos);}//刪除printf("********delete**********\n");_Delete(list,2);_Print(list,my_Print);printf("Linked list size:%d\n",_Size(list)); //釋放內(nèi)存 _Free(list);return 0; }三:結(jié)果顯示
1.編譯環(huán)境
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 LinkList.c -o a.out -std=c99 ./a.out3.結(jié)果顯示
總結(jié)
以上是生活随笔為你收集整理的数据结构一:链表(linux链表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 让程序在后台运行
- 下一篇: linux 其他常用命令