头插法建立单链表图示过程(其中an表示时间上第n个建立的节点,L为头指针,箭头表指向,sn代表an的地址)

结构体代码与主函数如下:
struct Link //创建一个结构体类型
{
int data; //数据域
struct Link* p; //指针域
};
struct Link* Creat_link(void); //建立单链表函数
void print(struct Link*); //输出单链表函数
int main(void)
{
struct Link * L;
L = Creat_link();
print(L);
return 0;
}单链表建立函数如下:
struct Link* Creat_link(void)
{
struct Link* L, * s;//L是头指针
int i, n, size;
size = sizeof(struct Link);
L = (struct Link*)malloc(size);//首先建立头结点
L->p = NULL; //将头节点指针域赋值为空同时也为尾结点指针域置空做铺垫
scanf("%d", &n); //输入想要建立的单链表长度
if (n == 0)
{
return L;
}
scanf("%d", &L->data);
for (i = 1; i < n; i++)
{
s = (struct Link*)malloc(size);//建立新的节点
scanf("%d", &s->data);
s->p = L->p;//把新的节点与后面的节点接上
L->p = s;//把新的节点与头结点接上
}
return L;
}/*
这两行的代码是头插法的核心:
s->p = L->p;
L->p = s;
要细细品味,这两行代码如果从逻辑上看第一次执行和第n(n>=2)次执行是不一样的
第一次执行是把新建立的节点作为尾结点并且37行使其指针域为空,第n次执行时是把
新建立的节点插入到头结点的下一个,37行使其与后面接上,38行使其与头结点接上
*/
输出函数如下:
void print(struct Link* L)
{
if (L->p == NULL)
{
printf("此链表为空");
}
else
{
while (1)
{
printf("%d ", L->data);
if (L->p == NULL) break;
L = L->p;
}
}
}注:本人小白,如有错误还望指教
版权声明:本文为qq_62025266原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。