c的链表
来源:互联网 发布:adc0804 51单片机 编辑:程序博客网 时间:2024/05/29 17:34
头文件
`
#ifndef LIST_H
#define LIST_H
#include <stdlib.h>//定义基础的结构typedef struct ListElmt_{ void *data; struct ListElmt_ *next;}ListElmt;//定义列表typedef struct list_{ int size;//大小 int (*match)(const void *key1,const void *key2);//比较,匹配 void (*destroy)(void *data);//内存释放函数 ListElmt *head;//头 ListElmt *tail;//尾部}List;//初始化void list_init(List *list,void(*destroy)(void *data));//在element元素后插入一个元素,如果element为空,则插入链表头部int list_ins_next(List *list, ListElmt *element,const void *data);//删除element后面的那个元素,如果element为空,则删除链表头元素int list_rem_next(List *list,ListElmt *element,void **data);//删除一个列表,删除列表里面存储的datavoid list_destroy(List *list);//定义基础的宏,获取各种基础的数据:获取大小,头,尾部,判断是头,是尾,数据,下一个元素#define list_size(list) ((list)->size)#define list_head(list) ((list)->head)#define list_tail(list) ((list)->tail)#define list_is_head(list,element) ((element) == (list)->head?1:0)#define list_is_tail(element) ((element)->next == NULL?1:0)#define list_data(element)((element)->data)#define list_next(element)((element)->next)#endif
`
实现代码
#include <stdlib.h>#include <string.h>#include <stdio.h>#include "list.h"void list_init(List *list,void(*destroy)(void *data)){ list->size = 0; list->destroy = destroy; list->head = list->tail = NULL; return;}//在element元素后插入一个元素,//如果element为空,则插入链表头部//需要考虑链表为空的情况int list_ins_next(List *list, ListElmt *element,const void *data){ //创建新数据 ListElmt *new_element; if((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) return -1; new_element->data = (void *)data; new_element->next = NULL; //如果选定数据为空,插入到表头 if(element == NULL){ //如果列表为空,尾部也指向新元素 if(list_size(list) == 0) list->tail = new_element; //在头链表前插入 new_element->next = list->head; list->head = new_element; }else{ //如果是最后一个元素 if(element->next == NULL) list->tail = new_element; //在元素后插入 new_element->next = element->next; element->next = new_element; } list->size ++; return 0;}//删除element后面的那个元素//如果element为空,则删除链表头元素int list_rem_next(List *list,ListElmt *element,void **data){ //队列不为空 if(list_size(list) == 0){ return -1; } ListElmt *old_element; if(element == NULL){ //头部删除一个元素 *data = list->head->data; old_element = list->head; list->head = list->head->next; if(list_size(list) == 1) { list->tail = NULL; } }else{ //尾部删除一个元素 if(element->next == NULL){ return -1; } *data = element->next->data; old_element = element->next; element->next = element->next->next; if(element->next == NULL){ list->tail = element; } } free(old_element); list->size --; return 0;}//删除一个列表,删除列表里面存储的datavoid list_destroy(List *list){ void *data; while(list_size(list) > 0){ if(list_rem_next(list,NULL,(void **) &data) == 0 && list->destroy != NULL){ list->destroy(data); } } memset(list,0,sizeof(List)); return;}
测试代码
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define ONE_MB (1024 * 1024)#include "list.h"typedef struct Info_{ int id; long phone;}Info;//打印一个列表void print_list_int(List *list);void print_list_info(List *list);void show_memory();void testFree();void tlist();void tlistArr();void tlistArrPoint();int main(int argc, char const *argv[]){ //tlistArr(); //tlistArrPoint(); tlist(); return 0;}void tlistArrPoint(){ List *listArr[3]; List *plist; listArr[0] = (List *)malloc(sizeof(List)); plist = listArr[0]; list_init(plist,free); Info *pi2 = (Info*)malloc(sizeof(Info)); pi2->id = 123131; pi2->phone = 13012131231; list_ins_next(plist,NULL,(void*)pi2); printf("plist->size:%d\n", plist->size); print_list_info(plist);}//测试list arrayvoid tlistArr(){ List listArr[3]; List *plist; plist = &listArr[0]; list_init(plist,free); Info *pi2 = (Info*)malloc(sizeof(Info)); pi2->id = 123131; pi2->phone = 13012131231; list_ins_next(plist,NULL,(void*)pi2); printf("plist->size:%d\n", plist->size); print_list_info(plist);}void tlist(){ printf("test list\n"); List *plist; plist = (List *)malloc(sizeof(List)); list_init(plist,free); printf("plist->size:%d\n", plist->size ); Info *pi2 = (Info*)malloc(sizeof(Info)); pi2->id = 123131; pi2->phone = 13012131231; list_ins_next(plist,NULL,(void*)pi2); Info *pi3 = (Info*)malloc(sizeof(Info)); pi3->id = 5370569; pi3->phone = 18611080217; list_ins_next(plist,NULL,(void*)pi3); Info *pi4 = (Info*)malloc(sizeof(Info)); pi4->id = 2231313; pi4->phone = 18643521217; list_ins_next(plist,NULL,(void*)pi4); //print list printf("plist->size:%d\n", plist->size); print_list_info(plist); //delete void **ppi = (void**)malloc(sizeof(Info)); list_rem_next(plist,NULL,ppi); //print list printf("plist->size:%d\n", plist->size ); print_list_info(plist); //show_memory(); //destroy list_destroy(plist); //show_memory(); //testFree();}//打印一个列表void print_list_info(List *list){ if(list_size(list) == 0){ printf("empty list\n"); return; } ListElmt *pl; pl = list_head(list); int i; printf("#########start#############\n"); for(i=0;i<list_size(list);i++){ printf("id=%d,phone=%ld\n",((Info*)list_data(pl))->id,((Info*)list_data(pl))->phone); pl = pl->next; } printf("#########end#############\n");}void testFree(){ struct stu { int num; char *name; char sex; float score; } *ps; ps=(struct stu*)malloc(sizeof(struct stu)); ps->num=102; ps->name="Zhang ping"; ps->sex='M'; ps->score=62.5; printf("Number=%d Name=%s ",ps->num,ps->name); printf("sex=%c Score=%f ",ps->sex,ps->score); free(ps);}//打印一个列表void print_list_int(List *list){ if(list_size(list) == 0){ printf("empty list\n"); return; } ListElmt *pl; pl = list_head(list); int i; for(i=0;i<list_size(list);i++){ printf("%d=>%d,",i+1,*(int*)pl->data); pl = pl->next; } printf("\n");}
0 0
- c的链表
- 复杂链表的复制(C/C++)
- [C/C++]链表的连接
- C 编写的链表
- c的链表实现
- c链表的练习
- C的链表实现
- C 链表的倒置
- c链表的实现
- c的双向链表
- 【C++】链表的使用
- 【c】链表的操作!!!
- C 链表的实现
- 链表的操作(C)
- 【C/C++】List链表的功能实现模型
- 【C/C++】链表的理解与使用
- 【C语言】C语言实现简单的链表
- 【C/C++】链表的理解与使用
- Eclipse 中常用的快捷键
- 文章标题
- ARM-Linux Gcc cross Compile Environment Set
- leetcode 33. Search in Rotated Sorted Array __java
- 二分查找的多种实现
- c的链表
- adams常用函数说明
- 字符串反转
- javafx的一些小技巧
- BZOJ斜率优化水题集
- UVALive3181-Fixing the Great Wall(区间dp)
- java中的值传递与引用传递
- windchill11 安装遇到的问题
- Linux运维笔记----系统恢复技术