数据结构笔记(一) 链表

链表的定义

链表是一种动态的数据结构,其中所有数据元素(data elements)彼此链接。链表是节点的集合,每个节点包含两部分数据(data)部分和地址(address)部分。

链表的优点

动态数据结构:链表是种动态数据结构,在程序执行期间可以随意增加或减少节点。
没有内存浪费:链表是在程序执行时,主动分配内存的因此不存在内存浪费问题。
可任意插入和删除数据:在链表中,可以指定删除和添加任意一个节点。

单链表

单链表的结构定义如下:

/*单链表的结构*/
typedef struct node
{
	int data;
	struct node *next;
}Node,*LinkList;

单链表增添、删除、查找等功能的实现:由于单链表是一种线性表,所以可以通过指针域的遍历来完成对数据对象的操作。

/*初始化单链表*/
LinkList NewLinkList()
{
	LinkList head;
	head = (LinkList)malloc(sizeof(Node));//为第一个元素分配内存空间
	head->data = 0;
	head->next = NULL;

	return head;
}

/*获取单链表的长度*/
int Length(LinkList head)
{
	LinkList p=head;
	int cnt = 1;

	while (p->next)//循环查找
	{
		p = p->next;
		cnt++;
	}

	return cnt;
}

/*获取指定位置的单链表*/
LinkList GetLinkList(LinkList head, int i)
{
	LinkList p = head;
	int cnt = 0;
	
	while (p&&cnt<i)
	{
		p = p->next;
		cnt++;
	}

	if (cnt != i) return NULL;

	return p;
}

bool Insert(LinkList head, int data, int i)
{
	LinkList p, q;
	
	p = GetLinkList(head, i - 1);//查找该第i个位置的节点

	if (!p) return false;

	q = (LinkList)malloc(sizeof(Node));	q->data = data;//为新节点分配内存空间,给元素赋值

	q->next = p->next; p->next = q;//重新生成链域

	return true;
}

bool RemoveAt(LinkList head, int i)
{
	LinkList p,q;
	
	p = GetLinkList(head, i - 1);//查找该第i个位置的节点

	if (!p || !p->next) return false;

	q = p->next;p->next = q->next;//重新生成链

	free(q);//释放该节点的空间

	return true;
}

猜你喜欢

转载自blog.csdn.net/RinKas/article/details/81409792
今日推荐