c语言单链表的创建,头插法,尾插法

单链表的创建有两种方式:头插法和尾插法。
这两种方法最大的区别在于对输入数据的存储方式不同,头插是逆序,尾插是顺序,尾插较于符合大多数人的习惯。但理解头插法对于理解单链表的插入和删除操作会有很大的帮助。
不论是哪种方法,了解其创建原理理清思路是十分重要的一步,代码其次。
对于一个单链表来说,分为有头节点的单链表和无头节点的单链表,头结点中不含数据域,头指针指向头结点;而无头节点的单链表中第一个节点的数据域可以是链表长度也可以是数据。

下面先介绍带有头结点的单链表两种创建方式。

1.准备工作:定义一个结构体类型重命名为node(方便引用,此处也可不用typedef语句)

typedef struct n 
{
	int a;
	struct n *next;
}node;

2.头插和尾插的原理大体上都是三步:为新节点分配空间---->链接新节点---->给新节点输入数据
区别在于链接新节点这一步。
顾名思义,尾插则是将新节点链接到链表的尾部
头插则是将新节点链接到链表的头结点的后面,即不断的在头节点和第一个节点之间插入新节点,每插入一个新节点,新节点就变为第一个节点,(可理解为插队)以此循环。

这里先定义三个node 型指针变量,并建立一个头节点。

node *head,*current,*tail;
current=(node*)malloc(sizeof(node));//头节点建立

head:头指针,指向头结点的指针变量;
current:指向新节点的指针变量;
tail:尾指针,随链表节点的增加指向链表的最后一个节点的指针变量,只在尾插法中用到尾指针。

3.根据三步原理逐步写出相应代码
a:为新节点分配空间;

current=(node*)malloc(sizeof(node));

b:链接新节点;
尾插法关键代码:

tail->next=current;//原链表尾节点指针域指向新节点
tail=current;//尾指针指向新链接的新节点,新节点变链表的尾节点(尾指针始终指向尾节点)

头插法关键代码:

current->next=head->next;//新节点的指针域指向*头结点的指针域原来指向的节点(即第一个节点)*
head->next=current;//头节点的指针域指向新节点,新节点变为第一个节点。

头插法链接步骤的两行关键代码次序不可调换!
因在原创建的链表中头节点之后的所有节点均通过head->next指向第一个节点来链接,故
若先让头节点的指针域(head->next)指向新节点,则原指向关系已丢失,原有头节点之后的节点将无法寻址。
c.给新节点输入数据;

scanf("%d",&current->a);

接下来给出两种方法带头节点单链表创建的具体代码,均用函数实现,函数返回值为node 指针类型,返回链表的头指针,函数形参为空,以用户输入非整形数据为结束链表创建标志。(也可将函数形参定义为链表的指定长度)
尾插法完整代码

node *create_tail(void)//有头结点
{
	node *head,*current,*tail;
	int m;//将输入的值存入m中以方便填写循环结束条件
	tail=head=current=(node*)malloc(sizeof(node));//创建头节点(无数据域),头指针尾指针指向头结点
	while(scanf("%d",&m)==1)//scanf()函数返回值为成功读取的数据个数,此判断条件用于判断是否从输入终端成功读取一个整形数据。
	{
		current=(node*)malloc(sizeof(node));//第一步:为新节点分配空间
		tail->next=current;//第二步:链接新节点      原链表尾节点指针域指向新节点
		tail=current;//第二步:链接新节点         尾指针指向新链接的新节点,新节点变链表的尾节点(尾指针始终指向尾节点)
		current->a=m;//第三步:给新节点输入数据        若读取数据成功,则将m赋给当前链表数据域
	}
	tail->next=NULL;//尾节点指针域指向NULL,结束链表创建
	return head;//返回链表头指针
}//尾插法//顺序

头插法完整代码

node *create_head(void)
{
	node *current,*head;
	int m;
	head=current=(node*)malloc(sizeof(node));//建立头结点,头指针指向头结点
	current->next=NULL;
	while(scanf("%d",&m)==1)
	{
		current=(node*)malloc(sizeof(node));为新节点分配空间
		current->next=head->next;//链接    新节点的指针域指向*头结点的指针域原来指向的节点(即第一个节点)*
		head->next=current;//链接   头节点的指针域指向新节点,新节点变为第一个节点。
		current->a=m;//赋值
	}
	return head;//返回头指针
}//头插法//逆序

看完后希望能对你有帮助~

猜你喜欢

转载自blog.csdn.net/CSDNGuoYuying/article/details/86532357