通用单链表C实现
来源:互联网 发布:minitab 前后数据分析 编辑:程序博客网 时间:2024/06/06 01:44
/************************************************************************* > File Name: linklist.c > Author: yaomianwei > Mail: 13642245956@163.com > Created Time: Fri 20 May 2016 08:58:31 PM CST ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<string.h>#define return_if_fail(p) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n",\ __func__, __LINE__); return;}#define return_val_if_fail(p,ret) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n",\ __func__, __LINE__); return (ret);}typedef enum Ret{ RET_OK, RET_ERR,}Ret;typedef void* ElemType;typedef struct Node{ ElemType data; struct Node *next;}Node;typedef struct Node* LinkList;typedef void (*PrintFunc)(ElemType e);Ret linklist_init(LinkList* L){ *L = (LinkList)malloc(sizeof(Node)); return_val_if_fail(L, RET_ERR); (*L)->next = NULL; return RET_OK;}size_t get_linklist_length(LinkList L){ size_t countRet = 0; LinkList p = L->next; while(p) { countRet++; p = p->next; } return countRet;}void print_int(ElemType e){ printf("%d ",(int)e);}Ret linklist_show(LinkList L, PrintFunc print){ LinkList p = NULL; p = L->next; while(p) { print(p->data); p = p->next; } printf("\n"); return RET_OK;}Ret linklist_insert_from_pos(LinkList L, size_t pos, ElemType e){ size_t count = 1; LinkList p, new; p = L; while(p && count < pos) { p = p->next; ++count; } if(!p || count > pos) { return RET_ERR; } new = (LinkList)malloc(sizeof(Node)); return_val_if_fail(new, RET_ERR); new->data = e; new->next = p->next; p->next = new; return RET_OK;}Ret linklist_del_from_pos(LinkList L, size_t pos, ElemType* e){ size_t count = 1; LinkList p = L; while(p->next && count < pos) { p = p->next; ++count; } if(!(p->next) || count > pos) { return RET_ERR; } LinkList q = p->next; p->next = q->next; *e = q->data; free(q); return RET_OK;}LinkList linklist_reverse(LinkList L){ LinkList p, q, r; p = L->next; q = p->next; p->next = NULL; while(q) { r = q->next; q->next = p; p = q; q = r; } L->next = p; return L;}Ret linklist_insert_from_head(LinkList L, ElemType e){ LinkList new = (LinkList)malloc(sizeof(Node)); return_val_if_fail(new, RET_ERR); new->data = e; new->next = L->next; L->next = new; return RET_OK;}Ret linklist_insert_from_tail(LinkList L, ElemType e){ size_t listLen = get_linklist_length(L); size_t pos; LinkList p = L, new; new = (LinkList)malloc(sizeof(Node)); return_val_if_fail(new, RET_ERR); new->data = e; for(pos = 0; pos < listLen; pos++) { p = p->next; } new->next = p->next; p->next = new; return RET_OK;}Ret linklist_get_elem(LinkList L, size_t pos, ElemType* e){ size_t count = 1; LinkList p; p = L->next; while(p && count < pos) { p = p->next; ++count; } if(!p || count > pos) { return RET_ERR; } *e = p->data; return RET_OK;}Ret linklist_clear(LinkList L){ LinkList p, q; p = L->next; while(p) { q = p->next; free(p); p = q; } L->next = NULL; return RET_OK;}Ret linklist_destroy(LinkList L){ LinkList p, q; p = L; while(p) { q = p->next; free(p); p = q; } return RET_OK;}int main(int argc, char** argv){ LinkList L = NULL; Ret ret = linklist_init(&L); if(ret == RET_ERR) { return -1; } int i; for(i = 0; i < 20; i++) linklist_insert_from_pos(L, 1, (void*)i); linklist_show(L, print_int); size_t LLen = get_linklist_length(L); printf("linklist's length is %d\n", LLen); int data = 50; linklist_insert_from_pos(L, 2, (void*)data); linklist_show(L, print_int); LLen = get_linklist_length(L); printf("linklist's length is %d\n", LLen); linklist_del_from_pos(L, 23, (void*)&data); linklist_show(L, print_int); LLen = get_linklist_length(L); printf("linklist's length is %d\n", LLen); printf("del num:%d\n", data); L = linklist_reverse(L); printf("reverse show:\n"); linklist_show(L, print_int); size_t pos = 4; linklist_get_elem(L, pos, (ElemType*)&data); printf("get num where pos is 4:%d\n", data); for(i = 30; i < 50; i++) { linklist_insert_from_head(L, (ElemType)i); } printf("insert data from head\n"); linklist_show(L, print_int); for(i = 70; i < 90; i++) { linklist_insert_from_tail(L, (ElemType)i); } printf("insert data from tail\n"); linklist_show(L, print_int); linklist_clear(L); linklist_destroy(L); return 0;}
0 0
- 通用单链表C实现
- 通用栈(c实现)
- 【C++】通用单链表
- c语言实现通用数据结构(一):通用链表
- c语言实现通用数据结构(二):通用队列
- c语言实现通用数据结构(三):通用椎栈
- c语言实现通用数据结构:通用映射(HashMap)
- c语言实现通用数据结构(一):通用链表
- c语言实现通用数据结构:通用集合(HashSet)
- 通用进度条的设计与实现【C#】
- C语言中实现通用双链表
- C语言实现通用数据类型栈结构
- 一个通用纯C队列的实现
- C实现通用数据结构--双向链表
- 用C语言实现通用链表
- C语言通用链表实现
- C语言~模拟实现通用冒泡排序
- Android下C/C++实现通用自启动守护实现
- php与Java的比较
- 测试内存屏障存在
- X264码率控制总结1——ABR,CQP,CRF
- #版本管理工具使用总结(git,svn,hg)
- 数据库SQL优化大总结之 百万级数据库优化方案
- 通用单链表C实现
- kali
- Python获取文件夹下所有的文件路径列表
- H.264 open-GOP
- 引用程序集没有强名称解决办法
- Java 枚举7常见种用法
- 关于PATCH的错误以及用法,几乎涵盖了所有。
- 如持有笔
- Sicily1934——移动小球