单链表的相关算法

好久没有看数据结构,打算最经好好复习一下数据结构,那就从头开始看起,这次先总结一下线性表这一章的有关操作,虽然思想简单,但是也不能轻视。
一、头插法
基本思想:首先申请一个头结点,并将头结点指针域置为NULL,每读入一个数据就申请一个节点,并插入到链表的头结点之后。注意在链表中的数据与读入的数据顺序相反。

核心代码:

LinkList Create_list()
{
Linklist H = (LinkList)malloc(sizeof(LNode));
H->next = NUll;
LNode s;
int x;
scanf("%d",&x);
while(x != -1)
{
	s = (LinkList)malloc(sizeof(LNode));
	s->data = x;
	s->next = H->next;
	H->next = s;
	scanf("%d",&x);
}
return H;
}

二、尾插法
基本思想:首先申请一个头结点,并将头结点指针域置为NULL,头指针H和尾指针r都指向头结点,读入数据,如果不是结束标志,则申请结点插入到r结点之后,并使得r指向新的结点。
核心代码:

LinkList Create_list()
{
Link_list H = (LinkList)malloc(sizeof(LNode));
H->next = NULL;
LNode s,r;
int x;
*r = H;
scanf("%d",&x);
while(x != -1)
{
	s = (LinkList)malloc(sizeof(LNode));
	s->data = x;
	s->next  = r->next;
	r->next = s;
	r = s;
	scanf("%d",&x);
}
return H;
}

三、插入
前面说了头插法和尾插法,这里再说插入大家应该都知道了,但是还是再说一下吧,加深理解。
重要代码:
p->next = s->next;
s->next = p;
就是一定要记住,要先保存前一个节点 s 的指向, 如果先将p节点链在s节点的尾部,那么s节点的下一个指向就会丢失。
四、删除
p指向要删除的节点,首先找到*p的前驱节点*q,然后完成删除操作。
重要代码:
q->next = p->next;
free(p);
即,让他的前驱节点指向他的后面的节点。要注意的而是找他前一个的节点。
五、倒置
倒置就是将链表中的顺序反过来。
基本思想:依次取原链表中的每个节点,将其作为第一个节点插入到新链表中。新链表中采用头插法。
重要代码:

void reverse(LinkList H)
{
LNode *p,*q;
p = H->next;   //用于指向当前节点  
H->next = NULL;   //利用前一个链表的头结点
while(p)          // p不为空,代表原链表没有结束
{
	q = p;
	p = p->next;     //p指向下一个节点
	q->next = H->next;   // 头插法插入
	H->next = q;
}
} 

接下来简单的说说静态链表的概念
静态链表是用数组实现的,每个数据元素除了存储数据信息外,还存储逻辑相邻的一个元素在数组中的位置。也就是说静态链表虽然是用数组实现的,但是其逻辑上相邻的元素不一定在物理上相邻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值