数据结构-5-160809双向有头环链
2016-08-09 16:34
447 查看
太没用了,暗自捶胸,代码写完 老多错误了,信心都没了,╮(╯▽╰)╭ 目前好歹实现了 , 有兴趣的凑合看下吧
===============================================08.12===========================
后面加了查找,删除,结果比较一直出问题,要找std5 结果std0就说找到了,找了好久好久。。。各种debug
然后发现是cmp函数的两个参数写反了,没有警告,没有错误,比较id都正常,比较名字就出问题
==================主函数=================================================
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"list.h"
#define SIZE 32
typedef struct _score_st
{
int id;
char name[SIZE];
int math;
int chinese;
}score_st;
void print_s(void *record)
{
const score_st *r = record;
printf("%d %s %d %d\n",r->id,r->name, r->math,r->chinese);
}
int id_cmp(void *key, void *record)
{
int *k = key;
score_st *r =record;
return (*k -r->id);
}
int name_cmp(void *key,void *record)
{
char *k = key;
score_st *r = record;
int ret;
ret = strcmp(k,r->name);
return ret;
}
int main()
{
LLIST *handle;
int i = 0;
int ret = 0;
score_st tmp;
handle = llist_create(sizeof( score_st));
for (i = 0; i<7;i++)
{
tmp.id = i;
snprintf(tmp.name, SIZE,"std%d",i);
tmp.math = rand()%100;
tmp.chinese = rand()%100;
ret = llist_insert(handle,&tmp,LLIST_AFTERWARD);
if(ret)
exit(1);
}
llist_travel(handle,print_s);
int id = 3;
printf("===================find===========\n");
char *del_name = "std5";
score_st *data;
data = llist_find(handle, del_name,name_cmp);
if(NULL ==data)
printf("fail to find it\n");
else
print_s(data);
/*
printf("=========delete=======\n");
char *del_name = "kkkk";
ret = llist_delete(handle, del_name, name_cmp);
if(ret ==-1)
printf("can't find it\n");
llist_travel(handle, print_s);
llist_fetch(handle,del_name,name_cmp,data);
print_s(data);
printf("==============fetch============\n");
llist_travel(handle,print_s);*/
llist_destroy(handle);
return 0;
}
=======================================list.c=============================
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"list.h"
LLIST *llist_create(int size)
{
LLIST *new;
new = malloc(sizeof(*new));
if (NULL == new)
return NULL;
new->size = size;
new->head.data = NULL;
new->head.next = &new->head;
new->head.prev = &new->head;
return new;
}
void llist_destroy(LLIST* ptr)
{
llist_node_st *cur;
llist_node_st *next;
for (cur = ptr->head.next; cur != &ptr->head ;cur = next)
{
next = cur->next;
free(cur->data);
free(cur);
cur = next;
}
free(ptr);
}
int llist_insert(LLIST *ptr,const void *data, int mode )
{
llist_node_st *new;
new = malloc(sizeof(*new));
if(new == NULL)
return -1;
new->data = malloc(ptr->size);
if (new->data == NULL)
return -2;
memcpy(new->data,data, ptr->size);
if(mode ==LLIST_FORWARD)
{
new->prev =&ptr->head;
new->next = ptr->head.next;
new->prev->next = new;
new->next->prev = new;
}
else if(mode == LLIST_AFTERWARD)
{
new->next = &ptr->head;
new->prev = ptr->head.prev;
new->prev->next = new;
new->next->prev = new;
}
else
return -3;
return 0;
}
void llist_travel(LLIST *ptr, llist_op *op)
{
llist_node_st *save;
for(save = ptr->head.next;save!=&ptr->head;save = save->next)
{
op(save->data);
}
}
static llist_node_st *find_(LLIST *ptr, void *key, llist_cmp *cmp)
{
llist_node_st *cur;
for (cur = ptr->head.next; cur!= &ptr->head;cur = cur->next)
{
if( cmp(key,cur->data)==0)
{
break;
}
}
return cur;
}
void *llist_find(LLIST *ptr, void *key, llist_cmp *cmp)
{
return find_(ptr, key, cmp)->data;
}
int llist_fetch(LLIST *ptr, void *key, llist_cmp *cmp,void *data)
{
llist_node_st *node;
node = find_(ptr, key, cmp);
if(node==&ptr->head)
return -1;
node->prev->next = node->next;
node->next->prev = node->prev;
if(data != NULL)
memcpy(node->data, data, ptr->size);
free(node->data);
free(node);
return 0;
}
int llist_delete( LLIST *ptr, void *key, llist_cmp * cmp)
{
llist_node_st *node;
node = find_(ptr, key, cmp);
if(node == &ptr->head)
return -1;
node->prev->next = node->next;
node->next->prev = node->prev;
free(node->data);
free(node);
return 0;
}
=================================list.h========================================
#ifndef LIST_H__
#define LIST_H__
#define LLIST_FORWARD 1
#define LLIST_AFTERWARD 2
typedef struct _llist_node_st
{
void *data;
struct _llist_node_st *prev;
struct _llist_node_st *next;
}llist_node_st;
typedef struct _LLIST
{
int size;
llist_node_st head;
}LLIST;
typedef void llist_op(void *);
typedef int llist_cmp( void *, void*);
LLIST *llist_create(int size);
void llist_destroy(LLIST* );
int llist_insert(LLIST *,const void *data, int mode );
void *llist_find(LLIST *, void *key, llist_cmp *);
int llist_fetch(LLIST *, void *key, llist_cmp *, void *);
int llist_delete( LLIST *, void *key, llist_cmp *);
//list_fetch();
//llist_delete();
void llist_travel(LLIST *,llist_op *op);
#endif
===============================================08.12===========================
后面加了查找,删除,结果比较一直出问题,要找std5 结果std0就说找到了,找了好久好久。。。各种debug
然后发现是cmp函数的两个参数写反了,没有警告,没有错误,比较id都正常,比较名字就出问题
==================主函数=================================================
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"list.h"
#define SIZE 32
typedef struct _score_st
{
int id;
char name[SIZE];
int math;
int chinese;
}score_st;
void print_s(void *record)
{
const score_st *r = record;
printf("%d %s %d %d\n",r->id,r->name, r->math,r->chinese);
}
int id_cmp(void *key, void *record)
{
int *k = key;
score_st *r =record;
return (*k -r->id);
}
int name_cmp(void *key,void *record)
{
char *k = key;
score_st *r = record;
int ret;
ret = strcmp(k,r->name);
return ret;
}
int main()
{
LLIST *handle;
int i = 0;
int ret = 0;
score_st tmp;
handle = llist_create(sizeof( score_st));
for (i = 0; i<7;i++)
{
tmp.id = i;
snprintf(tmp.name, SIZE,"std%d",i);
tmp.math = rand()%100;
tmp.chinese = rand()%100;
ret = llist_insert(handle,&tmp,LLIST_AFTERWARD);
if(ret)
exit(1);
}
llist_travel(handle,print_s);
int id = 3;
printf("===================find===========\n");
char *del_name = "std5";
score_st *data;
data = llist_find(handle, del_name,name_cmp);
if(NULL ==data)
printf("fail to find it\n");
else
print_s(data);
/*
printf("=========delete=======\n");
char *del_name = "kkkk";
ret = llist_delete(handle, del_name, name_cmp);
if(ret ==-1)
printf("can't find it\n");
llist_travel(handle, print_s);
llist_fetch(handle,del_name,name_cmp,data);
print_s(data);
printf("==============fetch============\n");
llist_travel(handle,print_s);*/
llist_destroy(handle);
return 0;
}
=======================================list.c=============================
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"list.h"
LLIST *llist_create(int size)
{
LLIST *new;
new = malloc(sizeof(*new));
if (NULL == new)
return NULL;
new->size = size;
new->head.data = NULL;
new->head.next = &new->head;
new->head.prev = &new->head;
return new;
}
void llist_destroy(LLIST* ptr)
{
llist_node_st *cur;
llist_node_st *next;
for (cur = ptr->head.next; cur != &ptr->head ;cur = next)
{
next = cur->next;
free(cur->data);
free(cur);
cur = next;
}
free(ptr);
}
int llist_insert(LLIST *ptr,const void *data, int mode )
{
llist_node_st *new;
new = malloc(sizeof(*new));
if(new == NULL)
return -1;
new->data = malloc(ptr->size);
if (new->data == NULL)
return -2;
memcpy(new->data,data, ptr->size);
if(mode ==LLIST_FORWARD)
{
new->prev =&ptr->head;
new->next = ptr->head.next;
new->prev->next = new;
new->next->prev = new;
}
else if(mode == LLIST_AFTERWARD)
{
new->next = &ptr->head;
new->prev = ptr->head.prev;
new->prev->next = new;
new->next->prev = new;
}
else
return -3;
return 0;
}
void llist_travel(LLIST *ptr, llist_op *op)
{
llist_node_st *save;
for(save = ptr->head.next;save!=&ptr->head;save = save->next)
{
op(save->data);
}
}
static llist_node_st *find_(LLIST *ptr, void *key, llist_cmp *cmp)
{
llist_node_st *cur;
for (cur = ptr->head.next; cur!= &ptr->head;cur = cur->next)
{
if( cmp(key,cur->data)==0)
{
break;
}
}
return cur;
}
void *llist_find(LLIST *ptr, void *key, llist_cmp *cmp)
{
return find_(ptr, key, cmp)->data;
}
int llist_fetch(LLIST *ptr, void *key, llist_cmp *cmp,void *data)
{
llist_node_st *node;
node = find_(ptr, key, cmp);
if(node==&ptr->head)
return -1;
node->prev->next = node->next;
node->next->prev = node->prev;
if(data != NULL)
memcpy(node->data, data, ptr->size);
free(node->data);
free(node);
return 0;
}
int llist_delete( LLIST *ptr, void *key, llist_cmp * cmp)
{
llist_node_st *node;
node = find_(ptr, key, cmp);
if(node == &ptr->head)
return -1;
node->prev->next = node->next;
node->next->prev = node->prev;
free(node->data);
free(node);
return 0;
}
=================================list.h========================================
#ifndef LIST_H__
#define LIST_H__
#define LLIST_FORWARD 1
#define LLIST_AFTERWARD 2
typedef struct _llist_node_st
{
void *data;
struct _llist_node_st *prev;
struct _llist_node_st *next;
}llist_node_st;
typedef struct _LLIST
{
int size;
llist_node_st head;
}LLIST;
typedef void llist_op(void *);
typedef int llist_cmp( void *, void*);
LLIST *llist_create(int size);
void llist_destroy(LLIST* );
int llist_insert(LLIST *,const void *data, int mode );
void *llist_find(LLIST *, void *key, llist_cmp *);
int llist_fetch(LLIST *, void *key, llist_cmp *, void *);
int llist_delete( LLIST *, void *key, llist_cmp *);
//list_fetch();
//llist_delete();
void llist_travel(LLIST *,llist_op *op);
#endif
相关文章推荐
- 几种基本数据结构--栈、队列、双向链表、有根树的分析和简单实现
- 线性表16:双向链表 - 数据结构和算法21
- 数据结构:双向链表2
- 数据结构:将二叉搜索树转换成一个排序的双向链表
- 数据结构-双向循环链表
- Java 数据结构之Deque(双向队列)
- 数据结构学习日志之四--循环链表和双向链表
- 数据结构-双向链表
- 数据结构之双向带头节点带环链表的实现
- 实现了起起重合,起止重合,止止重合,止起重合判断的双向链表数据结构(对无序数据输入的处理)
- 数据结构:带头结点的双向循环链表
- nginx学习六 高级数据结构之双向链表ngx_queue_t
- 一步一步学数据结构之1--1(双向链表)
- 数据结构JavaScript——双向链表、双向循环链表
- [何海涛][数据结构][把二元查找树转变成排序的双向链表]浅析
- 使用java实现双向链表数据结构
- 利用python的双向队列(Deque)数据结构实现回文检测的算法
- C语言数据结构之双向链表
- 数据结构:双向链表2
- 数据结构-双向链表插入