无头结点的单链表

首先,无头结点的链表和有头结点的链表有什么区别呢?

先来了解头结点是什么:

头结点是在首元结点之前设的一个结点,其 next 指针指向首元结点,其数据域可以不存储任何信息,但是头结点一定指向是链表中第一个结点的指针,而且头指针不能变。

无论链表是否为空,头指针都是非空指针,指向首元结点。

有头结点时,对链表的第一个数据元素的操作(插入、删除)与其他的数据元素相同,无需进行特殊处理。

无头结点时,如果增加的元素放在第一个结点前,或者删除第一个结点时,要换新的首元结点,此时要用到二级指针。

这是无头链表插入结点的代码:(插入的结点要放在第一个的话,就特殊一些)

//在无头结点链表插入元素
#include<stdio.h>
#include<stdlib.h>
struct node
{
	int x;
	struct node* next;
};
int w;
int main()
{
	struct node *t,*q,*p,*head;
	int i, n ,a;
	head = NULL;
	scanf("%d", &n);
    //输入链表中的元素,用malloc函数开辟一块空间
    //然后将输入的值放入指针p中存放数据的变量x中
    //将p的后继指针赋为NULL(也可以在全部输入完毕后将p的后继指针赋为NULL)主要是防止链表指向未知空间
    //如果头指针为空,说明还未存放数据,此时输入的数据放入头指针
    //否则将q的后继指针指向p(此时的q是上一个结点)
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a);
		p = (struct node*)malloc(sizeof(struct node));
		p->x = a;
		p->next = NULL;
		if (head == NULL)
			head = p;
		else
			q->next = p;
		q = p;
	}
	t = head;
	while (t != NULL)
	{
		printf("%d ", t->x);
		t = t->next;
	}
	printf("\n");

	//插入元素
	i = 1;
	printf("插入的元素和位置分别是:");
	int data , x;
	t = head;
	scanf("%d%d", &data,&x);
	p = (struct node*)malloc(sizeof(struct node));
	p->x = data;
	if (x == 1)
	{
		p->next = head;
		head = p;
	}
	else
	{
		while (t != NULL)
		{
			t = t->next;
			if (x-1 == i)
			{
				p->next = t->next;
				t->next = p;
			}
			i++;
		}
	}
    //输出前,要把指针赋为头结点
	t = head;
	while (t != NULL)
	{
		printf("%d ", t->x);
		t = t->next;
	}
	return 0;
}

对于有头链表就简单一些,因为在首元结点前有头结点,此时在插入数据在第一个位置的时候,直接用相同的连接即可,不需要重新设置头结点。

//head->next=q;(此时要插入p结点)
p->next = head->next;
head->next = p;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明里灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值