大神级别的--双链表
实在那一看懂,求解!!!忘懂的人回复详解一下,,,急!!急!!急!!
1.llist.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);
}
}
2. llist.h
#ifndef HS_LLIST_H
#define HS_LLIST_H
#define LLIST_ADD_FORWARD 0
#define LLIST_ADD_BACKWARD1
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 */
3. main.c
#include <stdio.h>
#include "llist.h"
#define NAMESIZE 32
struct score {
int id;
char name;
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;
}
答案是这样的!!!
有没有看懂的人回复一下!!! 大哥啊,代码你就用插入代码的方法啊,弄成文本形式的很不爽的。
你的问题是什么?没看懂啊。麻烦明确下啊 你知道单链表就 应该看得懂这个代码啊。无非是每个链表节点除了有个指向它后继的指针外,还有个指向它前驱的指针。 编程难 发表于 2013-8-19 12:00 static/image/common/back.gif
大哥啊,代码你就用插入代码的方法啊,弄成文本形式的很不爽的。
你的问题是什么?没看懂啊。麻烦明确下啊
一个有十年嵌入式经验的人在讲链表时的程序,我听得也比较糊涂...... 所以我也不懂 仰望天上的光 发表于 2013-8-19 19:20 static/image/common/back.gif
你知道单链表就 应该看得懂这个代码啊。无非是每个链表节点除了有个指向它后继的指针外,还有个指向它前驱的 ...
一个有十年嵌入式经验的人在讲链表时的程序,我听得也比较糊涂...... 所以我也不懂 :cryv不知道啥东西 谢谢~~~~~~~~~ 谢谢啊啊啊 不是很懂,支持一下 你想问啥呢? 到底有多大神
页:
[1]