挑战高手——用c实现一个双向链表

shunfengfeiyang 2004-09-09 08:38:52
发现用c实现一个双向链表原来蛮复杂的,支持任意位置的删除,通过指针删除其所在位置的元素,头指针还需要初始化,如果需要这个双向链表适应任意情况,将更复杂。
随时可能内存泄漏,靠。
谁有源码啊,学习一下先。
其实我也写了一个,支持尾部插入节点,任意位置删除节点,觉得还是不好。大家随便看看啦,我感觉好像随时会出现内存泄漏什么的。
-------------------------------------------
/* list.h
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 06 Sep 2004
*/
typedef struct listnode {
struct listnode *next;
struct listnode *prior;
//int jobnum;
} listnode;

typedef struct list {
listnode *head;
int empty; //1 --empty, 0--not empty
} list;

void list_init(list *myroot);
void list_put(list *myroot, listnode *mynode);
int list_remove(list *myroot,listnode *mynode);

-----------------------------------------
/* list.c
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 06 Sep 2004
**
*/

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

void list_init(list *myroot) {
myroot->head = malloc(sizeof(listnode));
myroot->head->prior = NULL;
myroot->head->next = NULL;
myroot->empty = 1;
}

//insert node at the tail
void list_put(list *myroot,listnode *mynode) {
mynode->next = NULL;
mynode->prior = NULL;
myroot->empty = 0;

listnode* p_node = myroot->head->next;
if(p_node == NULL)
{
myroot->head->next = mynode;
}
else
{
while(p_node->next != NULL)
{
p_node = p_node->next;
}
p_node->next = mynode;
mynode->prior = p_node;
}
}

int list_remove(list *myroot,listnode *mynode) {
/* remove from root */
listnode *p_node = mynode;
if(myroot->head->next == NULL || p_node == NULL)
{
return 0;
}
//remove the first node, obtain the list has only one node
if(p_node->prior == NULL)
{
//the list has only one
if(p_node->next == NULL)
{
myroot->head->next = NULL;
myroot->empty = 1;
}
else
{
p_node->next->prior = NULL;
myroot->head->next = p_node->next;
}
}
//remove the last node
else if(p_node->next == NULL)
{
p_node->prior->next = NULL;
}
else
{
p_node->prior->next = p_node->next;
p_node->next->prior = p_node->prior;
}
free(p_node);

return 1;
}
...全文
380 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
brucegong 2004-09-16
  • 打赏
  • 举报
回复




教材上都有例程了就不要拿出来问人了吧




tiger999 2004-09-16
  • 打赏
  • 举报
回复
写个双向链表还用请高手吗?
fanbest 2004-09-16
  • 打赏
  • 举报
回复
就是就是。

我从来没有看过这么长的程序。楼主能写出这么长的当然算个高手了,那还问什么问题呢?
xydarcher 2004-09-16
  • 打赏
  • 举报
回复
基本数据结构的实现,不是高手也应该熟练掌握。
junmayang 2004-09-16
  • 打赏
  • 举报
回复
too easy
liukang520236 2004-09-16
  • 打赏
  • 举报
回复
数据结构的基础啊,随便找本关于数据结构的书第一章里都会涉及啊~~
sttony 2004-09-16
  • 打赏
  • 举报
回复
我最近一次自己实现双向链表是我写驱动的时候,其他都用STL,这个也没什么难度,稍微注意一点不要把指针乱指就行了。。
hearlihong 2004-09-16
  • 打赏
  • 举报
回复
笨笨刚才不是看了更长的程序吗?
呵呵,关于STL vector模板的resize函数
shunfengfeiyang 2004-09-16
  • 打赏
  • 举报
回复
没办法了,明天去买书。
jxhwei 2004-09-15
  • 打赏
  • 举报
回复
严重同意楼上的笨笨
248406869 2004-09-15
  • 打赏
  • 举报
回复
太长了,我从来都不看超过10行的程序。
lifeixiao 2004-09-15
  • 打赏
  • 举报
回复
不要轻易得说出“高手”两个字......
wyh2002 2004-09-15
  • 打赏
  • 举报
回复
数据结构(C语言版)的好象就要那样的例子
lhawk1980 2004-09-15
  • 打赏
  • 举报
回复
随便找一本数据结构的书上就有例子程序
zhaotao0982 2004-09-15
  • 打赏
  • 举报
回复
严蔚敏的书上有,自己看去吧
daylove 2004-09-15
  • 打赏
  • 举报
回复
最近眼睛老是痛
shunfengfeiyang 2004-09-15
  • 打赏
  • 举报
回复
没有人看的吗???
shunfengfeiyang 2004-09-10
  • 打赏
  • 举报
回复
……
其实我是想让大家看看我的代码是不是有问题。
bluebubble 2004-09-09
  • 打赏
  • 举报
回复
看数据结构!!
  • 打赏
  • 举报
回复
用C写双向链表也不一定要高手才能做得到,我就做得到,但我不是高手,
C基础好一点、数据结构清楚的人都可以做到的。不要拿高手二字来吓人。
加载更多回复(1)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧