通用单链表C实现
2016-05-22 23:00
393 查看
/************************************************************************* > 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; }
相关文章推荐
- 【转】MSMQ消息队列安装
- 数据库SQL优化大总结之 百万级数据库优化方案
- Window Server 2008 R2 在Active Directory域中不能更改服务器密码策略
- 单例模式中的线程安全(延迟加载)
- 测试内存屏障存在
- 数组
- X264码率控制总结1——ABR,CQP,CRF
- #版本管理工具使用总结(git,svn,hg)
- CODEFORCES Educational Round 12 E. Beautiful Subarrays
- Python学习笔记(一)三步走安装pip
- Java实现将一个文件进行压缩
- 希尔排序
- spring集成Ehcache
- c语言学习笔记13之二维数组1
- 协查技巧总结
- c++第6次作业
- recyclerview使用详解
- 推荐8个实现 SVG 动画的 JavaScript 库
- GeekBand C++第二周学习感悟
- ViewPager不能高度自适应?height=wrap_content 无效解决办法