数据结构笔记(一) 链表

链表的定义

链表是一种动态的数据结构,其中所有数据元素(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;
}

循环链表

我们将单链表的尾指针指向起始节点,那么所有的节点将会形成一个环形结构,我们将之称为循环链表(Circular Linked List)

双向链表

我们将单链表的节点中再添加一个指针指向前一个节点,那么就形成了一个可以前后节点相互访问的链表,我们将之称为双向链表(Doubly Linked List)

双向表的结构定义如下:

/*双向链表的结构*/
typedef struct dnode
{
	int data;
	struct dnode *prior,*next;
}DNode, *DLinkList;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值