C语言头插法尾插法创建单链表

前言

链表 [Linked List]:链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构 【节点】,按特定的顺序链接在一起的抽象数据类型。
下面介绍单链表的创建:

创建节点

链表是由一个个节点构成的,首先我们就要创建节点
首先用结构体创建节点Node

typedef struct Node
{
	int data;			//数据域
	struct Node* next;  //指针域
}LNode, * Linklist;		//LNode为节点,Linklist为zhiz

头插法创建单链表

Linklist CreateFromHead() //头插法创建单链表
{
	Linklist L;			//定义头指针L
	LNode *s;			//定义节点的指针s
	int x;				//定义要输入的数据
	L = (Linklist)malloc(sizeof(Linklist));//为头指针开辟内存空间
	L->next = NULL;		//将头指针的next初始化为空
	//输入数据
	printf("请输入一个整型数:");
	scanf("%d", &x);
	//用循环继续添加数据,当输入为-1时输入完成
	while (x != -1)
	{
		s = (LNode*)malloc(sizeof(Linklist));//为新数据开辟内存空间
		s->data = x;		//将数据存入到节点的data中
		s->next = L->next;	//将新数据的next赋值为头节点的next
		L->next = s;		//将头节点指向新数据
		//继续输入新的数据
		printf("请输入一个整型数:");
		scanf("%d", &x);
	}
	return L;				//返回头节点
}

尾插法创建单链表

Linklist CreateFromTail() //尾插法创建单链表
{
	Linklist L;			//定义头指针L
	LNode *r,*s;		//定义节点的指针r和s,s指向新开辟的数据,r指向尾节点
	int x;				//定义要输入的数据
	L = (LNode*)malloc(sizeof(LNode));//为头指针开辟内存空间
	L->next=NULL;		//将头指针的next初始化为空
	r=L;				//将尾指针指向头指针L
	//输入数据
	printf("请输入一个整型数:");
	scanf("%d", &x);
	//用循环继续添加数据,当输入为-1时输入完成
	while (x != -1)
	{
		s = (LNode*)malloc(sizeof(LNode));//为新数据开辟内存空间
		s->data = x;						//将数据存入到节点的data中
		s->next = r->next;					//将新数据的next赋值为头节点的next
		r->next = s;						//将尾指针指向新数据
		r=s;								//将新插入的节点设为尾指针
		//输入数据
		printf("请输入一个整型数:");
		scanf("%d", &x);
	}
	r->next=NULL;						//将尾指针的next指向NULL
	return L;		//返回头节点
}

总结

头插法和尾插法建立单链表步骤很相似,而尾插法需要将新插入的节点重新设为尾节点,以上就是两种方法创建单链表。

  • 14
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
头插法是一种在链表头部插入元素的方法,相比尾插法头插法更加高效,因为不需要遍历整个链表。 下面是一个带头结点的单链表头插法的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 创建带头结点的单链表 ListNode *createList() { ListNode *head = (ListNode *) malloc(sizeof(ListNode)); // 创建头结点 head->next = NULL; // 头结点的 next 指针指向 NULL return head; } // 在头部插入节点 void insertAtHead(ListNode *head, int val) { ListNode *newNode = (ListNode *) malloc(sizeof(ListNode)); // 创建新节点 newNode->val = val; // 设置新节点的值 newNode->next = head->next; // 新节点的 next 指针指向原来的第一个节点 head->next = newNode; // 头结点的 next 指针指向新节点 } // 打印链表 void printList(ListNode *head) { ListNode *p = head->next; while (p != NULL) { printf("%d ", p->val); p = p->next; } printf("\n"); } int main() { ListNode *head = createList(); // 创建头结点 insertAtHead(head, 3); // 在头部插入节点 insertAtHead(head, 2); insertAtHead(head, 1); printList(head); // 打印链表 return 0; } ``` 上述代码中,`createList()` 函数用于创建带头结点的单链表,`insertAtHead()` 函数用于在头部插入节点,`printList()` 函数用于打印链表。在 `main()` 函数中,我们先创建了一个带头结点的单链表,然后在头部插入了三个节点,最后打印出链表的所有节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值