Lead the bidirectional circular linked list——双向循环链表

//lead the bidirectional circular link list

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

#defineNAMESIZE 24

typedef struct stuinfo{
int id;
char name[NAMESIZE];
int math;
}DATA;

static void print_s(const void *data)
{
const DATA *stup = data;
printf("%d %s %d\n",
stup->id,
stup->name,
stup->math);
}

static int IdCmp(const void *key, const void *data)
{
const int *id = key;
const DATA *stup = data;

return (*id - stup->id);
}
static int NameCmp(const void *key, const void *data)
{
const char *name = key;
const DATA *stup = data;

return strcmp(name, stup->name);
}

int main()
{
int i;
int id = 5;
char name[NAMESIZE] = "stu3";
DATA stu, *stup;
LIST handle = NULL;

handle = ListCreate(sizeof(DATA));
if(NULL == handle)
return -1;

for(i = 0; i < 6; i++)
{
stu.id = i + 1;
snprintf(stu.name,NAMESIZE,
"stu%d", i + 1);
stu.math = 100 - i;

//ListInsert(handle, &stu, HEADINSERT);
ListInsert(handle, &stu, TAILINSERT);
}
/*find*/
//stup = ListFind(handle, &id, IdCmp);
stup = ListFind(handle, name, NameCmp);
if(stup != NULL)
print_s(stup);
else
printf("not find\n");
ListDelete(handle, name, NameCmp);
ListDelete(handle, &id, IdCmp);

ListDisplay(handle, print_s);
ListDispose(handle);

return 0;
}
————————————————————————————

#ifndef _LIST_H__
#define _LIST_H__

#define HEADINSERT1
#define TAILINSERT 2

struct listnode;
struct headnode;
typedef struct headnode *LIST;
typedef struct listnode *PtrNode;

typedef void print(const void *);
typedef int cmp(const void *, const void *);

LIST ListCreate(int);
int ListInsert(LIST, const void *, int);
void *ListFind(LIST, const void *, cmp *);
int ListDelete(LIST, const void *, cmp *);
int ListFetch(LIST, const void *, cmp *, void *);
void ListDisplay(LIST, print *);
void ListDispose(LIST);

struct listnode{
void *data;
struct listnode *prev;
struct listnode *next;
};

struct headnode{
int size;
struct listnode head;
};

#endif

——————————————————————————

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

LIST ListCreate(int size)
{
LIST handle = malloc(sizeof(*handle));
if(NULL == handle)
return NULL;

handle->size = size;
handle->head.data = NULL;
handle->head.prev = handle->head.next = &handle->head;

return handle;
}

int ListInsert(LIST l, const void *data, int mode)
{
PtrNode cur = malloc(sizeof(*cur));
if(NULL == cur)
return -1;
cur->data = malloc(l->size);
if(NULL == cur->data)
{
free(cur);
return -2;
}

memcpy(cur->data, data, l->size);

if(mode == HEADINSERT)
{
cur->next = l->head.next;
cur->prev = &l->head;
}
else if(mode == TAILINSERT)
{
cur->next = &l->head;
cur->prev = l->head.prev;
}
else
{
free(cur->data);
free(cur);
return -3;
}
cur->prev->next = cur;
cur->next->prev = cur;
return 0;
}

static PtrNode find(LIST l, const void *key, cmp *funp)
{
PtrNode p = l->head.next;

for(;p != &l->head && funp(key, p->data); p = p->next);

return p;
}

void *ListFind(LIST l, const void *key, cmp *funp)
{
return find(l, key, funp)->data;
}

int ListDelete(LIST l, const void *key, cmp *funp)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;

p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;

free(p->data);
free(p);
//p = NULL;
return 0;
}

int ListFetch(LIST l, const void *key, cmp * funp, void *data)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;

memcpy(data, p->data, l->size);
p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;

free(p->data);
free(p);
//p = NULL;
return 0;
}

void ListDisplay(LIST l, print *funp)
{
PtrNode p = l->head.next;

while(p != &l->head)
{
funp(p->data);
p = p->next;
}
}

void ListDispose(LIST l)
{
PtrNode p = l->head.next;
PtrNode q;

while(p != &l->head)
{
q = p;
p = p->next;

free(q->data);
free(q);
}
free(l);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值