在linux下用c语言写了个双向链表,开心

poking1986 2008-10-30 03:44:50

/*
sgx 2008-10-30 c语言 双向链表
*/
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#define TRUE 1;
#define FALSE 0;

typedef int ELEMTYPE;

typedef struct DoubleLinkNode
{
ELEMTYPE data;
struct DoubleLinkNode *last;
struct DoubleLinkNode *next;
}dLinkNode,*dLinkList;

dLinkList CreateDLlist(void);/*创建空链*/
int InitDLlist(dLinkList * dl);/*初始化链*/
int InsertLNode(dLinkNode *pNode,ELEMTYPE e);/*节点前插入节点,返回TRUE,FALSE*/
int InsertNNode(dLinkNode *pNode,ELEMTYPE e);/*在某节点后面插入节点,*/
int DeleteNode(dLinkNode *pNode);/*删除节点,返回TRUE换或FALSE*/
void DestroyDLlist(dLinkList dl);/*销毁链*/
void LNTravel(dLinkList dl);/*从前向后遍历*/
void NLTravel(dLinkList dl);/*从后向前遍历*/
int main()
{
dLinkList dl=CreateDLlist();
if(InitDLlist(&dl))printf("Initial sucess!\n");
LNTravel(dl);
NLTravel(dl);
DestroyDLlist(dl);
return 0;
}
dLinkList CreateDLlist(void)/*创建空链*/
{
dLinkList dl=NULL;
return dl;
}
int InitDLlist(dLinkList *dl)/*初始化链*/
{
ELEMTYPE e;
char symbol;
dLinkNode *pNode;
if(*dl!=NULL)
{printf("this LinkList has been Initialed.\n");return FALSE;}
printf("input data:");
scanf("%d",&e);
getchar();/*获取空格*/
*dl=(dLinkNode*)malloc(sizeof(dLinkNode));
if(dl==NULL){printf("assigned memory failed,end Initailization!\n");
return FALSE;}
(*dl)->data=e;
(*dl)->next=NULL;
(*dl)->last=NULL;
pNode=*dl;
printf("continue?y/n ");
scanf("%c",&symbol);
getchar();
while(symbol=='y' || symbol=='Y')
{
printf("input data:");
scanf("%d",&e);
getchar();
InsertNNode(pNode,e);
pNode=pNode->next;
printf("continue?y/n ");
scanf("%c",&symbol);
getchar();
}
return TRUE;

}
int InsertLNode(dLinkNode *pNode,ELEMTYPE e)/*节点前面插入节点,返回TRUE,FALSE*/
{
dLinkNode *newNode,*lastNode;
if(pNode==NULL)
{
printf("Node is NULL,canot operate!\n");
return FALSE;
}
newNode = (dLinkNode*)malloc(sizeof(dLinkNode));
if(!newNode){printf("assigned memory failed!\n");return FALSE;}/*分配失败*/
newNode->data=e;/*插入数据*/
if(pNode->last==NULL)
{
newNode->last=NULL;
}
else
{
lastNode = pNode->last;
lastNode->next = newNode;
newNode->last = lastNode;

}
newNode->next=pNode;
pNode->last=newNode;
return TRUE;
}
int InsertNNode(dLinkNode *pNode,ELEMTYPE e)/*在某节点后面插入节点,*/
{
dLinkNode *newNode,*nextNode;
if(pNode==NULL)
{
printf("Node is NULL,canot operate!\n");
return FALSE;
}
newNode = (dLinkNode*)malloc(sizeof(dLinkNode));
if(!newNode){printf("assigned memory failed!\n");return FALSE;}/*分配失败*/
newNode->data = e;/*插入数据*/

if(pNode->next==NULL)
{
newNode->next=NULL;
}
else
{
nextNode=pNode->next;
newNode->next = nextNode;
nextNode->last=newNode;
}
pNode->next=newNode;
newNode->last=pNode;

return TRUE;
}
int DeleteNode(dLinkNode *pNode)/*删除节点,返回FALSE或TRUE*/
{
ELEMTYPE e;
dLinkNode *LastNode,*NextNode;
if(pNode==NULL){printf("Node is NULL,cannot operate it!\n");return FALSE;}
LastNode=pNode->last;
NextNode = pNode->next;
e=pNode->data;
if(pNode->next ==NULL && NULL == pNode->last)
{
free(pNode);
printf("%d is deleted,this LinkList now is NULL!\n",e);
return TRUE;
}
else if(pNode->next == NULL)
{
LastNode->next = NULL;
}
else if(pNode->last == NULL)
{
NextNode->last=NULL;
}
else
{
LastNode->next=NextNode;
NextNode->last=LastNode;
}
free(pNode);
printf("%d is deleted.\n",e);
return TRUE;
}
void DestroyDLlist(dLinkList dl)/*销毁链*/
{
dLinkNode *pNode=dl;
dLinkNode *temp;
if(pNode==NULL)
{printf("the LinkList has been already destroyed!\n");return;}
while(pNode->next != NULL)
{
temp=pNode;
pNode=temp->next;
DeleteNode(temp);
}
DeleteNode(pNode);
}
void LNTravel(dLinkList dl)/*从前向后遍历*/
{
dLinkList pNode;
if(dl==NULL){printf("LinkList is NULL!\n");return;}
pNode=dl;
printf("Travel this LinkList InOrder: ");
do
{
printf("%d\t",pNode->data);
pNode=pNode->next;
}while(pNode!=NULL);
printf("\n");
}
void NLTravel(dLinkList dl)/*从后向前遍历*/
{ dLinkList pNode;
if(dl==NULL){printf("LinkList is NULL!\n");return;}
pNode=dl;
printf("Travel this LinkList PostOrder: ");
while(pNode->next!=NULL)pNode=pNode->next;
do
{
printf("%d\t",pNode->data);
pNode=pNode->last;
}while(pNode!=NULL);
printf("\n");
}

...全文
845 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiendabo1 2011-10-14
  • 打赏
  • 举报
回复
楼主您好!您在
int InitDLlist(dLinkList *dl)/*初始化链*/
函数中将形参dl作为指针对了,因为该函数要对传人的实参(也是个指针)本身进行修改。但是有一个漏洞了
if(dl==NULL)
{
printf("assigned memory failed,end Initailization!\n");
return FALSE;
}
条件应该是if(*dl == NULL),不然就是把前面一句内存申请语句去掉它也会认为已经成功分配了内存。
因为进入函数后,临时变量dl肯定不等于NULL,只是他的内容即*dl == NULL。
poking1986 2008-10-31
  • 打赏
  • 举报
回复
我没看多少linux c的书的,就记住几个命令
gcc -c test.c 编译c
gcc -o test test.c 生成test
g++ -o test test.cpp 编译并生成c++

另外一些是vi的命令

gdb 和 make 有点复杂,还没有仔细学。

今晚想去借本linux c编程回来看的,哪知道借满了,只可以借一本,就借了《the c++ programming language》回来看,之前看过了《c++ primer 第四版》,很喜欢那本书,不过听说《the c++ programming language》也很不错,而且是Bjane写的,还觉得应该读一下。
stealfire 2008-10-30
  • 打赏
  • 举报
回复

楼主推荐两本linux下的c编程书籍吧?


谢谢。
jackzhhuang 2008-10-30
  • 打赏
  • 举报
回复
再接再厉!
poking1986 2008-10-30
  • 打赏
  • 举报
回复
我也是在虚拟机下写的啊
final_authority 2008-10-30
  • 打赏
  • 举报
回复
心里不平衡啊,装了个linux虚拟机,到现在没研究明白,怎么办楼主,是否赞助下?
kool86 2008-10-30
  • 打赏
  • 举报
回复
up
冰封猪 2008-10-30
  • 打赏
  • 举报
回复
`````````````````
CoderPlusPlus 2008-10-30
  • 打赏
  • 举报
回复
恭喜恭喜
frank_323 2008-10-30
  • 打赏
  • 举报
回复
UP
九桔猫 2008-10-30
  • 打赏
  • 举报
回复
不错。。。。。。。。。。。。。。。。。。。。。。。
二.内核链表 内核链表是一种链表,Linux内核中的链表都是用这种形式实现的 1.特性 内核链表是一种双向循环链表,内核链表的节点节点结构中只有指针域 使用内核链表的时候,将内核链表作为一个成员放入到一个结构体中使用 我们在链表中找到内核链表结构的地址,通过这个地址就可以找到外部大结构体的地址,通过大结构体就可以访问其中的成员 优势: 内核链表突破了保存数据的限制,可以用内核链表来保存任何数据(使用一种链表表示各种类型的数据,通用性很强) 内核链表中只有指针域,维护起来更加方便,效率更高 2.使用 内核链表在内核中已经被实现,我们只需要调用其接口直接使用即可 内核链表的实现代码在内核源代码的list.h文件中 3.源代码分析 (1)节点结构: struct list_head { struct list_head *next, *prev;//前置指针 后置指针 }; (2)初始化 #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) (3)插入 //从头部插入 static inline void list_add(struct list_head *new, struct list_head *head)//传入要插入的节点和要插入的链表 { __list_add(new, head, head->next); } //从尾部插入 static inline void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } (4)通过节点找到外部结构体的地址 //返回外部结构体的地址,第一个参数是节点地址,第二个参数是外部结构体的类型名,第三个参数是节点在外部结构体中的成员名 #define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) (5)遍历内核链表 //遍历内核链表 #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); \ pos = pos->next) //安全遍历内核链表 #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) C语言的双链表,可以增加。插入,删除,修改,销毁等函数接口。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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