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;
}

输出结果为

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值