linux下c语言 双向链表

简介: C/C++ code /*sgx 2008-10-30 c语言 双向链表*/#include #include #include #define TRUE 1;#define FALSE 0;typedef int ELEMTYPE;typedef struct DoubleLinkNode{...
C/C++ code
 
   

/*
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");
}
摘自: http://topic.csdn.net/u/20081030/15/250b5b04-319b-45fe-a8a7-b079b6380743.html
相关文章
|
21天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
49 4
|
1月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
1月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
27 0
|
1月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
17 1
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
23 1
|
21天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
5月前
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
25 0
|
2月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
2月前
|
存储 测试技术 C语言
C语言实现链表的各种功能
本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。