双向链表初步

linux下的两个头文件和源码(自定义的~)

__________________________________________

list.h

___________________________________________

#ifndef HS_LLIST_H
#define HS_LLIST_H


#define LLIST_ADD_FORWARD   0
#define LLIST_ADD_BACKWARD  1


typedef void llist_op(void *);


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


typedef struct {
int size;
struct llist_node_st head;
} LLIST;


LLIST *llist_creat(int size);


void llist_destroy(LLIST *);


int llist_add(LLIST *, const void *data, int dir);


//llist_delet(LLIST *, );


//llist_find(LLIST *, );


void llist_travel(LLIST *, llist_op *op);


#endif /* HS_LLIST_H */

____________________________________________________

list.c

____________________________________________________


#include <stdlib.h>
#include <string.h>


#include "llist.h"


#if 0
struct llist_node_st {
void *data;
struct llist_node_st *prev;
struct llist_node_st *next;
};
typedef struct {
int size;
struct llist_node_st head;
} LLIST;
#endif


LLIST *llist_creat(int size)
{
LLIST *new;


new = malloc(sizeof(*new));
if (new == NULL) {
return NULL;
}


new->size = size;
new->head.next = new->head.prev = &new->head;


return new;
}


void llist_destroy(LLIST *);


int llist_add(LLIST *ptr, const void *data, int dir)
{
struct llist_node_st *newnode;


newnode = malloc(sizeof(*newnode));
if (newnode == NULL) {
goto malloc_node_err;
}
newnode->data = malloc(ptr->size);
if (newnode->data == NULL) {
goto malloc_data_err;
}


memcpy(newnode->data, data, ptr->size);


if (dir == LLIST_ADD_FORWARD) {
newnode->next = ptr->head.next;
newnode->prev = &ptr->head;
} else {
newnode->next = &ptr->head;
newnode->prev = ptr->head.prev;
}


newnode->next->prev = newnode;
newnode->prev->next = newnode;


return 0;




free(newnode->data);
malloc_data_err:
free(newnode);
malloc_node_err:
return -1;
}


//llist_delet(LLIST *, );


//llist_find(LLIST *, );


void llist_travel(LLIST *ptr, llist_op *op)
{
struct llist_node_st *cur;


for (cur = ptr->head.next; cur != &ptr->head; cur = cur->next) {
op(cur->data);
}
}


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

test_list.c

___________________________________________________

#include <stdio.h>


#include "llist.h"


#define NAMESIZE 32


struct score {
int id;
char name[NAMESIZE];
int ch;
int math;
int en;
};


static void print_score(void *data)
{
struct score *d = data;
printf("%d %s %d %d %d\n", d->id, d->name, d->ch, d->math, d->en);
}


int main(void)
{
struct score tmp;
LLIST *list;
int i;


list = llist_creat(sizeof(struct score));
/* if error */


for (i = 0; i < 9; i++) {
tmp.id = i;
tmp.ch = 100 - i;
tmp.math = 100 - i * 2;
tmp.en = 100 - i * 3;
snprintf(tmp.name, NAMESIZE, "stu%d", i);


llist_add(list, &tmp, LLIST_ADD_FORWARD);
}


llist_travel(list, print_score);


//llist_destroy(list);


return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值