数据结构一:链表(linux链表)
生活随笔
收集整理的這篇文章主要介紹了
数据结构一:链表(linux链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:實現機制
linux鏈表實現思想就是:結點里面只創建一個next指針,用指針將各個結點相連接 打印和查找的時候,再進行類型的轉換
二:代碼
1 LinkList.h
/* LinkList.h linux鏈表實現思想就是:結點里面只創建一個next指針,用指針將各個結點相連接 打印和查找的時候,在進行類型的轉換 */ #ifndef _LINKLIST_H_ #define _LINKLIST_H_ #include<stdlib.h> #include<stdio.h>//鏈表小結點 和普通鏈表相比較 沒有數據域 只有next指針 typedef struct LINNODE{struct LINNODE *next; }Link_Node; //鏈表,有頭結點和長度 typedef struct LINKLIST{Link_Node head;// Link_Node的結構體,而不是結構體指針 int size;//結點個數 }Link_List; //查找回調函數 typedef int (*FIND)(Link_Node *data1,Link_Node *data2); //打印回調函數 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); //結點個數size int _Size(Link_List *list); //釋放內存 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++){//查找插入位置的前一個結點 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++){//查找插入位置的前一個結點 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){//打印頭結點不需要考慮for(Link_Node *Current_Node=list->head.next;Current_Node!=NULL;Current_Node=Current_Node->next){my_Print(Current_Node);} } //結點個數size int _Size(Link_List *list){return list->size; } //釋放內存 void _Free(Link_List *list){if(list!=NULL){free(list);list=NULL;} }3 main.c
/* main.c linux鏈表實現思想就是:結點里面只創建一個next指針,用指針將各個結點相連接 打印和查找的時候,在進行類型的轉換 */ #include "LinkList.h" #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct PERSON{Link_Node node;char name[64];int age; }Person;//打印回調 void my_Print(Link_Node *data){Person *p=(Person *)data;//數據類型的轉換printf("name:%s age:%d\n",p->name,p->age); }//回調查找 int my_Find(Link_Node *data1,Link_Node *data2){//數據類型轉換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_();//實例產生數據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)); //釋放內存 _Free(list);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 LinkList.c -o a.out -std=c99 ./a.out3.結果顯示
總結
以上是生活随笔為你收集整理的数据结构一:链表(linux链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让程序在后台运行
- 下一篇: 数据结构一:链表(循环链表)