/*************************************************************************
> 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;
}
通用单链表C实现
最新推荐文章于 2022-11-20 16:19:55 发布