单链表的定义和基本操作

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O⑴。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")。

链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。

以上都是度娘提供的! 下面才是重点!!!

链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

今天就写一下单链表的定义和一本操作!


先看一下头文件内容,应该是包含了所有数据结构材料中提供的关于链表的基本操作了,进阶操作将在下一篇文章里进行实现!

#ifndef _LINK_H_
#define _LINK_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*单链表数据域类型定义*/
typedef int ElemType;

/*单链表结点结构定义*/
typedef struct _Node
{
	ElemType data;
	struct _Node * next;
}NODE,*PNODE;

/*单链表头结点类型定义*/
typedef NODE HEAD,*PHEAD;

/*单链表头结点初始化*/
int Init(PHEAD *pHead);
/*单链表打印*/
void Show(PHEAD pHead);
/*单链表在头结点后面插入结点*/
int Insert_Head(PHEAD pHead,ElemType e);
/*单链表尾部插入结点*/
int Insert_Tail(PHEAD pHead,ElemType e);
/*单链表某结点之后插入结点插入结点*/
int Insert_AnyPos(PNODE node,ElemType e);
/*单链表某结点之前插入结点插入结点,e不存在则插入在末尾*/
int Insert_Previous(PHEAD pHead,ElemType e);
/*单链表获得某结点的前驱*/
int Get_Prior(PHEAD pHead,PNODE node,PNODE *pre);
/*删除指定结点*/
int Delete(PHEAD pHead,ElemType e);
/*单链表销毁*/
int Destory(PHEAD *pHead);
/*单链表逆置*/
void Reverse(PHEAD pHead);
/*单链表排序*/
int Sort(PHEAD Sort);

#endif


下面就是单链表的基本操作的实现了,基本都没有什么难度,我还是一个字一个字仔细的敲了一遍,并且经过调试验证正确的!

希望能对需要的童鞋有所帮助!

/*
功能:单链表的定义和基本操作!
姓名:Ben
时间:22:46 2014/1/21
*/

#include"link.h"

int Init(PHEAD *pHead)
{
	int rv = 0;
	if(NULL != *pHead)
	{
		return rv;
	}
	*pHead = (PHEAD)malloc(sizeof(HEAD));
	if(NULL == *pHead)
	{
		rv = -1;
		return rv;
	}
	memset(*pHead,0,sizeof(HEAD));
	return rv;
}

void Show(PHEAD pHead)
{
	if(NULL == pHead || NULL == pHead->next)
	{
		printf("Empty Link!\n");
		return;
	}
	pHead = pHead->next;

	while(pHead)
	{
		printf("%d ->",pHead->data);
		pHead = pHead->next;
	}
	printf("NULL \n");
	return;
}

int Insert_Head(PHEAD pHead,ElemType e)
{
	int rv = 0;
	if(NULL == pHead)
	{
		rv = -2;
		return rv;
	}
	PNODE node = NULL;
	node = (PNODE)malloc(sizeof(NODE));
	if(node == NULL)
	{
		rv = -1;
		return rv;
	}
	node->data = e;
	node->next =pHead->next;
	pHead->next = node;

	return rv;
}

int Insert_Tail(PHEAD pHead,ElemType e)
{
	int rv = 0;
	if(NULL == pHead)
	{
		rv = -2;
		return rv;
	}
	PNODE node = NULL;
	node = (PNODE)malloc(sizeof(NODE));
	if(node == NULL)
	{
		rv = -1;
		return rv;
	}
	while(pHead->next != NULL)
	{
		pHead = pHead->next;
	}
	node->data = e;
	node->next = pHead->next;
	pHead->next = node;

	return rv;
}

int Insert_AnyPos(PNODE node,ElemType e)
{
	int rv = 0;
	if(NULL == node)
	{
		rv = -2;
		return rv;
	}
	PNODE pNode = NULL;
	pNode = (PNODE)malloc(sizeof(NODE));
	if(NULL == pNode)
	{
		rv = -1;
		return rv;
	}
	pNode->data = e;
	pNode->next = node->next;
	node->next = pNode;
	return rv;
}

int Insert_Previous(PHEAD pHead,ElemType e)
{
	int rv = 0;
	if(NULL == pHead)
	{
		rv = -2;
		return rv;
	}
	while (pHead->data !=e && pHead->next != NULL)
	{
		pHead = pHead->next;
	}
	PNODE node = NULL;
	node = (PNODE)malloc(sizeof(NODE));
	if(node == NULL)
	{
		rv = -1;
		return rv;
	}
	node->data = e;
	node->next =pHead->next;
	pHead->next = node;

	return rv;
}

PNODE Get_Prior(PHEAD pHead,PNODE node)
{
	if(pHead == NULL || node == NULL)
	{
		return NULL;
	}
	PNODE p = pHead;
	while(p->next != node && p->next != NULL)
	{
		p = p->next;
	}
	if(p->next == NULL)
	{
		return NULL;
	}
	return p;
}

int Delete(PHEAD pHead,ElemType e)
{
	int rv = 0;
	if(NULL == pHead)
	{
		rv = -2;
		return rv;
	}
	while (pHead->next->data !=e && pHead->next != NULL)
	{
		pHead = pHead->next;
	}
	if(NULL == pHead->next)
	{
		return rv;
	}
	else
	{
		PNODE tmp = pHead->next;
		pHead->next = pHead->next->next;
		free(tmp);
		tmp = NULL;
	}
	return rv;
}

int Destory(PHEAD *pHead)
{
	int rv = 0;
	if(NULL == *pHead)
	{
		rv = -2;
		return rv;
	}
	while (NULL != (*pHead)->next)
	{
		PNODE tmp = (*pHead)->next;
		(*pHead)->next = (*pHead)->next->next;
		free(tmp);
	}
	free((*pHead));
	*pHead = NULL;
	return rv;
}

void Reverse(PHEAD pHead)
{
	if (!pHead || !pHead->next || !pHead->next->next)
	{
		return;
	}
	PNODE p1 =pHead->next;
	PNODE p2 =p1->next;
	PNODE p3;
	p1->next = NULL;
	while (p2)
	{
		p3 = p2->next;

		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}
	pHead->next = p1;
}

void Sort(PHEAD pHead)
{
	if (!pHead || !pHead->next || !pHead->next->next)
	{
		return;
	}
	PNODE p1 =pHead->next->next;
	PNODE p2;
	while (p1)
	{
		p2 = Get_Prior(pHead,p1);
		PNODE tmp = p1->next;
		while (p2 != pHead && p2->data > p1->data)
		{
			if(p2->next == p1)
			{
				p2->next = tmp;
			}
			p2 = Get_Prior(pHead,p2);
		}
		if(p2->next != p1)
		{
			p1->next = p2->next;
			p2->next = p1;
		}
		p1 = tmp;
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值