通用单链表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
原创粉丝点击