首先,无头结点的链表和有头结点的链表有什么区别呢?
先来了解头结点是什么:
头结点是在首元结点之前设的一个结点,其 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;