C语言--链表1

· 链表

链表是包含数据的独立数据结构(节点)的集合,其每个节点通过指针连接在一起。通常,节点是动态分配的。

· 单链表

每个节点包含一个指向链表下一节点的指针。最后一个指针的值为NULL,提示链表后不再有元素。其简单的结构声明如下,

//定义链表节点结构体
typedef struct NODE
{
	struct NODE *link;
	int value;
}Node;
在单链表中插入元素节点,

#define FALSE 0
#define TRUE 1
//定义链表节点结构体
typedef struct NODE
{
	struct NODE *link;
	int value;
}Node;
//在单链表中插入元素
int sll_insert(register Node **linkp,int value)
{
	register Node *current;		//定义指向当前节点的指针
	register Node *New;			//定义要插入的指针

	while((current=*linkp)!=NULL&¤t->value<value)
	{
		linkp=¤t->link;			//linkp指向下一个节点
	}

	//为新的节点分配内存
	New=(Node *)malloc(sizeof(Node));
	if(New==NULL)
	{
		return FALSE;
	}
	New->value=value;

	//将新的节点插入链表
	New->link=current;
	*linkp=New;

	return TRUE;
}

· 双链表

在一个双链表中,每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。其简单的结构声明如下,

typedef struct NODE
{
	struct NODE *fp;
	struct NODE	*bp;
	int value;
}node;			//定义双链表的节点
在双链表中插入元素,可能有以下4种情况,

1、新值位于链表中间;

2、新值位于链表起始;

3、新值位于链表末尾;

4、新值既位于起始,又位于末尾,空表。

其实现代码如下,

//双链表中插入元素
typedef struct NODE
{
	struct NODE *fp;
	struct NODE	*bp;
	int value;
}node;			//定义双链表的节点

//双链表元素插入函数
int dll_insert(node *rootp,int value)
{
	node *This;
	node *Next;
	node *newnode;

	//判断在原链表中是否有value值,如果是就返回
	for(This=rootp;(Next=This->fp)!=NULL;This=Next)
	{
		if(Next->value==value)	//如果原链表中有value
		{
			return 0;
		}
		if(Next->value>value)	//如果下一节点的数值大于value
		{
			break;				//找到要插入节点的位置
		}
	}

	newnode=(node *)malloc(sizeof(node));	//为新的节点分配内存空间
	if(newnode==NULL)
		return -1;				//如果未分配到内存
	newnode->value=value;		//添加值

	//把新值(新节点)添加到链表中
	//1、中间;2、起始;3、末尾;4、空表
	if(Next!=NULL)		//没有位于链表尾部 1 2情况
	{
		if(This!=rootp)	//情况1:中间,没有位于链表起始位置
		{
			This->fp=newnode;
			newnode->fp=Next;
			Next->bp=newnode;
			newnode->bp=This;
		}
		else			//情况2:起始位置
		{
			rootp->fp=newnode;
			newnode->fp=Next;
			Next->bp=newnode;
			newnode->bp=NULL;
		}
	}
	else               //位于链表尾部, 3 4情况
	{
		if(This!=rootp)	//情况3:不是空表
		{
			rootp->bp=newnode;
			newnode->bp=This;
			This->fp=newnode;
			newnode->fp=NULL;
		}
		else			//情况4 :空表
		{
			newnode->fp=NULL;
			rootp->fp=newnode;
			newnode->bp=NULL;
			rootp->bp=newnode;
		}
	}
	return 1;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值