数据结构一:链表(单向链表)
生活随笔
收集整理的這篇文章主要介紹了
数据结构一:链表(单向链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:需求分析
不連續內存空間,單向鏈表,有頭結點,插入,刪除,查找,獲得鏈表長度,返回第一個結點,回調打印,釋放內存
二:代碼
LinkList.h
#ifndef _LINKLIST_H_ #define _LINKLIST_H_//定義結點 typedef struct LINKNODE{//結點有數據和指針void *data;//任何類型的數據都可以接收struct LINKNODE *next; }Link_Node;//定義鏈表 typedef struct LINKLIST{//有大小和頭結點Link_Node *head;//頭結點不保存數據int size; }Link_List; //打印顯示的回調函數 typedef void (*PRINT)(void*data); //初始化 Link_List *_Init_List(); //在指定位置中插入結點 void Inset_List(Link_List *list,int pos,void *data); //刪除根據指定位置 void Delete_List(Link_List *list,int pos); //打印,我們不知道數據類型,用回調函數 void Print_List(Link_List *list,PRINT myPrint); //返回第一個結點 void *Front_List(Link_List *list); //根據值查找 int Find_List(Link_List *list,void *); // 獲得鏈表長度 int Size_List(Link_List *list); //釋放內存 void Free_List(Link_List *list);#endifLinkList.c
#include "LinkList.h" #include <stdio.h> #include <stdlib.h>//初始化 Link_List *_Init_List(){//開辟鏈表空間//Link_Node *node=(Link_Node*)malloc(sizeof(Link_Node)); Link_List *list=(Link_List*)malloc(sizeof(Link_List));list->size=0;//頭結點不保存數據 list->head=(Link_Node*)malloc(sizeof(Link_Node));list->head->data=NULL;list->head->next=NULL;return list; } //在指定位置中插入結點 void Inset_List(Link_List *list,int pos,void *data){if(list==NULL){return ;}//pos位置如果不對,默認插最后if(pos<0||pos>list->size){pos=list->size;} //1.創建新結點Link_Node *New_Node=(Link_Node*)malloc(sizeof(Link_Node));New_Node->data=data;New_Node->next=NULL;//2.遍歷查找插入位置的前一個位置Link_Node *Current_Node=list->head;for(int i=0;i<pos;i++){Current_Node=Current_Node->next;} //3.插入New_Node->next= Current_Node->next;Current_Node->next=New_Node;//4.數量加一list->size++; } //刪除根據指定位置 void Delete_List(Link_List *list,int pos){if(list==NULL||pos<0||pos>list->size){return;}//循環遍歷Link_Node *Current_Node=list->head;for(int i=0;i<pos;i++){//找到刪除結點的前一個結點 Current_Node=Current_Node->next; }Link_Node *Delete_Node=Current_Node->next;//需要刪除的結點Current_Node->next=Delete_Node->next;free(Delete_Node);list->size--;} //打印,我們不知道數據類型,用回調函數 void Print_List(Link_List *list,PRINT myPrint){//循環遍歷Link_Node *Current_Node=list->head->next;while(Current_Node!=NULL){myPrint(Current_Node->data);Current_Node=Current_Node->next;} } //返回第一個結點 void *Front_List(Link_List *list){return list->head->next->data; } //查找 int Find_List(Link_List *list,void *data){if(list==NULL){return -1;}Link_Node *Current_Node=NULL;int i=0;for(Current_Node=list->head->next;Current_Node!=NULL;Current_Node++,i++){if(Current_Node->data==data){break;}}return i; } // 獲得鏈表長度 int Size_List(Link_List *list){if(list==NULL){return -1;}return list->size; } //釋放內存 void Free_List(Link_List *list){if(list==NULL){return ;}//先釋放結點內存Link_Node *Current_Node=list->head->next;while(Current_Node!=NULL){Link_Node *Next_Node=Current_Node->next;//緩存下一個結點 free(Current_Node);Current_Node=Next_Node;}Current_Node=NULL;//再釋放鏈表內存 list->size=0;free(list);list=NULL; }oneWay_List.c
#include "LinkList.h" #include <stdio.h> #include <stdlib.h>//創建數據 typedef struct PERSON{char name[24];int age;int score; }Person; //打印回調函數 void myPrint(void *data){Person *p=(Person*)data;printf("name:%s age:%d score:%d\n",p->name,p->age,p->score); } int main(void){Person p1={"AAA",18,80};Person p2={"BBB",19,90};Person p3={"CCC",20,100};Person p4={"CCC",30,150};//初始化Link_List *list=_Init_List();printf("******insert*******\n");Inset_List(list,0,&p1);Inset_List(list,1,&p2);Inset_List(list,2,&p3);Inset_List(list,3,&p4);//打印,我們不知道數據類型,用回調函數 Print_List(list,myPrint);// 獲得鏈表長度printf("List length:%d\n",Size_List(list));//返回第一個結點printf("*******First node*******\n");Person *p=(Person *)Front_List(list);printf("First node name:%s age:%d score:%d\n",p->name,p->age,p->score);//查找 printf("*******find*******\n");int ret=Find_List(list,&p2);if(ret){printf("Found p2 at:%d\n",ret);}else{printf("could not find it.\n");}printf("*******delete*******\n");//刪除根據指定位置Delete_List(list,2);Print_List(list,myPrint);// 獲得鏈表長度printf("List length:%d\n",Size_List(list));//釋放內存 Free_List(list);//system("pause");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 oneWay_List.c LinkList.c -o a.out -std=c99 ./a.out總結
以上是生活随笔為你收集整理的数据结构一:链表(单向链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: collect2: error: ld
- 下一篇: 让程序在后台运行