C语言头插法/尾插法创建有/无头结点的单链表

先定义结点:

struct LinkList
{
	int data;
	struct LinkList *next;
};

头插法创建带头结点的单链表的函数:

头插法在每次插入新结点时都将新结点插到第一个结点的位置上,即在链表的头部插入。每次插入时都要先使新结点的后继变为头结点原来的后继,即头结点所链接的原第一个结点,再使头结点的后继变为新结点。

LinkList* CreateListHead(int *arr, int length)	// 头插法创建带头结点的单链表 
{
	int i;
	LinkList *head = (LinkList*)malloc(sizeof(LinkList));	// 创建头结点
	head->data = length;	// 头结点数据域存链表长度
	head->next = NULL;
	
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));    // 为结点申请空间
		p->data = arr[i];    // 节点数据域赋值
		p->next = head->next;	// 头插法 
		head->next = p;
	} 
	return head;	// 返回头结点 
}

头插法创建无头结点的单链表:

LinkList* CreateListHead_noHNODE(int *arr, int length)	// 头插法创建无头结点的单链表
{
	int i;
	LinkList *head;	// 创建头指针  *head此时为一个指向LinkList型数据的指针 
	head = NULL;
	
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));
		p->data = arr[i];
		p->next = head;	// 头插法 
		head = p;	// 两指针指向同一地址 
	} 
	return head;	// 返回第一个结点 
} 

尾插法创建带头结点的单链表的函数:

尾插法在每次插入新结点时都将新结点插到链表最后一个结点之后,即在链表的尾部插入。

LinkList* CreateListTail(int *arr, int length)	// 尾插法创建带头结点的单链表 
{
	int i;
	LinkList *head = (LinkList*)malloc(sizeof(LinkList));	// 创建头结点 
	head->data = length;	// 头结点数据域存链表长度 
	head->next = NULL;
	
	LinkList *r;	// 记录链表中的尾结点 
	r = head; 
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));
		p->data = arr[i];
		r->next = p;	// 尾插法 
		p->next = NULL;
		r = p;
	} 
	return head;	// 返回头结点 
}

尾插法创建无头结点的单链表:

LinkList* CreateListTail_noHNODE(int *arr, int length)	// 尾插法创建无头结点的单链表
{
	int i;
	LinkList *head;
	if(length<1)	// 传入为空时使头指针指向NULL 
		head = NULL;
	else if(length>=1)	// 传入非空时 
	{
		LinkList *r;	// 记录链表中的尾结点 
		head = (LinkList*)malloc(sizeof(LinkList));	// 先创建第一个结点,给数据域和指针域赋值 
		head->data = arr[0];
		head->next = NULL;
		r = head;		// r记录表中的最后一个结点,当前为第一个结点 
		
		for(i=1; i<length; i++)
		{
			LinkList *p = (LinkList*)malloc(sizeof(LinkList));
			p->data = arr[i];
			
			r->next = p;	// 尾插法 
			p->next = NULL;
			r = p;
		}
	}
	return head;	// 返回第一个结点
}

整体代码(函数调用举例):

#include<stdio.h>
#include<stdlib.h>
 
struct LinkList
{
	int data;
	struct LinkList *next;
};

LinkList* CreateListHead(int *arr, int length)	// 头插法创建带头结点的单链表 
{
	int i;
	LinkList *head = (LinkList*)malloc(sizeof(LinkList));	// 创建头结点
	head->data = length;	// 头结点数据域存链表长度
	head->next = NULL;
	
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));
		p->data = arr[i];
		p->next = head->next;	// 头插法 
		head->next = p;
	} 
	return head;	// 返回头结点 
}

LinkList* CreateListTail(int *arr, int length)	// 尾插法创建带头结点的单链表 
{
	int i;
	LinkList *head = (LinkList*)malloc(sizeof(LinkList));	// 创建头结点 
	head->data = length;	// 头结点数据域存链表长度 
	head->next = NULL;
	
	LinkList *r;	// 记录链表中的尾结点 
	r = head; 
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));
		p->data = arr[i];
		r->next = p;	// 尾插法 
		p->next = NULL;
		r = p;
	} 
	return head;	// 返回头结点 
}

LinkList* CreateListHead_noHNODE(int *arr, int length)	// 头插法创建无头结点的单链表
{
	int i;
	LinkList *head;	// 创建头指针  *head此时为一个指向LinkList型数据的指针 
	head = NULL;
	
	for(i=0; i<length; i++)
	{
		LinkList *p = (LinkList*)malloc(sizeof(LinkList));
		p->data = arr[i];
		p->next = head;	// 头插法 
		head = p;	// 两指针指向同一地址 
	} 
	return head;	// 返回第一个结点 
} 
 
LinkList* CreateListTail_noHNODE(int *arr, int length)	// 尾插法创建无头结点的单链表
{
	int i;
	LinkList *head;
	if(length<1)	// 传入为空时使头指针指向NULL 
		head = NULL;
	else if(length>=1)	// 传入非空时 
	{
		LinkList *r;	// 记录链表中的尾结点 
		head = (LinkList*)malloc(sizeof(LinkList));	// 先创建第一个结点,给数据域和指针域赋值 
		head->data = arr[0];
		head->next = NULL;
		r = head;		// r记录表中的最后一个结点,当前为第一个结点 
		
		for(i=1; i<length; i++)
		{
			LinkList *p = (LinkList*)malloc(sizeof(LinkList));
			p->data = arr[i];
			
			r->next = p;	// 尾插法 
			p->next = NULL;
			r = p;
		}
	}
	return head;	// 返回第一个结点
}

void LinkListPrintf(LinkList *linklist)	// 输出链表所有元素 若链表有头结点,则输出的第一个元素为头结点的数据域 
{
	while(linklist!=NULL)
	{
		printf("%d ", linklist->data);
		linklist = linklist->next;
	}
	printf("\n");
}

int main()
{
	int length = 5;
	int a[length] = {1,2,3,4,123}; 
	LinkList *h1 = CreateListHead(a, length);
	LinkListPrintf(h1);
	LinkList *h2 = CreateListHead_noHNODE(a, length);
	LinkListPrintf(h2);
	LinkList *h3 = CreateListTail(a, length);
	LinkListPrintf(h3);
	LinkList *h4 = CreateListTail_noHNODE(a, length);
	LinkListPrintf(h4);
	
	return 0;
}

输出结果为

 

  • 14
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
头插法指在链表头部插入新节点的方法,带头结点单链表是在链表头部添加一个不存储数据的头结点,其目的是为了方便链表的操作。以下是带头结点单链表头插法的实现代码: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建头结点单链表 Node* createList() { Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点 head->next = NULL; // 头结点的next指针初始化为NULL return head; } // 头插法插入新节点 void insertNode(Node* head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 创建节点 newNode->data = data; // 将数据存储到新节点中 newNode->next = head->next; // 新节点的next指针指向头结点的next指针指向的节点 head->next = newNode; // 头结点的next指针指向新节点 } // 打印单链表中的所有节点 void printList(Node* head) { Node* p = head->next; // 从头结点的下一个节点开始遍历 while (p != NULL) { printf("%d ", p->data); // 输出节点中存储的数据 p = p->next; // 指向下一个节点 } } int main() { Node* head = createList(); // 创建头结点单链表 insertNode(head, 1); // 头插法插入节点 insertNode(head, 2); insertNode(head, 3); printList(head); // 打印单链表中的所有节点 return 0; } ``` 输出结果为:3 2 1,表示成功地使用头插法将3、2、1三个节点插入到了带头结点单链表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值