本文主要是介绍【数据结构】带头结点的单链表的头插法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先要说明几个概念:
- 头结点,是单链表的头结点,一般不存储数据,它指向单链表的第一个实际元素。但它不仅仅只是一个普通的结点,它包含了整个链表的结构,也就是包含了所有插入的结点
#include<stdio.h>
#include<stdlib.h>typedef struct LNode {int data;struct LNode *next;
}LNode *LinkList;// 头插法建立一个单链表:在单链表的头部插入结点,从而建立一个单链表。
// 参数是一个LinkList类型的引用L,表示链表的头结点
LinkList head_insert(LinkList &L) {LNode *s;int x;L = (LinkList)malloc(sizeof(LNode)); // 创建头结点,用malloc函数给头结点申请一个存储空间L->next=NULL; // 初始化为空表,由于头结点指向链表的第一个实际元素,所以L->next=NULL,就表示链表为空scanf("%d",&x); // 用scanf函数输入一个整数x,只要x!=9999,就执行循环体 while(x!=9999) {s=(LNode *)malloc(sizeof(LNode)); // 创建新结点,用malloc函数给新结点分配一个存储空间 s->data=x; // 将输入的x的值赋值给s->data,即s的数据域 s->next=L->next; // 头结点L指向链表的第一个元素,将L的指针指向赋值给s,也就是说现在s指向了链表的第一个元素 L->next=s; // 再将s赋值给L->next,也就是说头结点L指向了s,头结点L只会指向链表的第一个实际元素,所以s现在成为了链表的第一个元素,头插法结束 scanf("%d", &x); /*** 再用scanf函数输入一个整数x,然后走while的条件判断,* 如果true,就接着执行循环体,依次往单链表的头部插入新结点,* 每次插入的新结点都成为链表的第一个结点,而原来的结点依次向后移动,* 如果false,就返回L */ } return L; // L虽然只是整个链表的头结点,但它不仅仅是一个普通的结点,它包含了整个链表的结构,也就是包含了所有插入的结点
}
这篇关于【数据结构】带头结点的单链表的头插法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!