(最详细)c语言尾插法&头插法代码讲解

1.尾插法

尾插法

头指针和尾指针都指向头结点,然后往里边插入元素,
每插入一个元素尾指针就后移一下

其中如下图所示 尾插法的核心代码是:

pointer->next = s; //pointer指向新生成的节点
pointer = pointer->next;//pointer移动至新节点位置

 尾插法建立单链表的算法如下:

#include <stdio.h>
#include <stdlib.h>

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

void printLinklist(struct Test *head) //验证链表打印函数
{
	struct Test *point = head;
	
	while(point != NULL)
	{
		printf("the data of the Linklist is:%d\n",point->data);
		point = point->next;
	}
}

struct Test* creatLinklistofBehind(struct Test *head)  //尾插法创建链表
{
	struct Test *now= NULL;
	struct Test *point = head;
	//head->data = 1;   //如果用方法一 便在头结点的data不存储数据
	
	while(1)  //循环建立链表
	{
        //动态申请一个名称为now的Node*指针类型的节点
		now = (struct Test*)malloc(sizeof(struct Test));
       
		now->next = NULL;             //初始化now的next指针为空指针,指向NULL 
		printf("Please Input the data to the newLink:\n");
		scanf("%d",&(now->data));     //对data进行赋值
		
		if(now->data == 0)            //当data=0 时退出
		{
			printf("the data is 0:Quit!\n");
			printf("\n");
			free(now);                //释放now指针
			return head;              //返回Test型指针
		}
		//注意如果用方法一 便动态建立头节点,并head ,point=now的操作要同时进行,保证两指针都是指向 相同头节点地址
		if(head == NULL)              
		{
			head = now;
            point=now;
		}
		else{
		    while(point->next != NULL)
	  	    {
				point = point->next;  //让point指针指向下一个结点,保证它指向链表尾部 
			}
			    point->next = now;    //让point指针指向的结点的next成员指向新建结点now
		}
    }
}


int main()
{
    //方法一 直接在creatLinklistofBehind 定义出头指针及其初始化
	struct Test *head = NULL;    
    //方法二 可以先动态申请一个名称为head的Test*指针类型的头节点
	/*head = (struct Test *)malloc(sizeof(struct Test));  
	head->next = NULL;            //初始化next=NULL
	*/
	head = creatLinklistofBehind(head);

   
	printLinklist(head);
	system("pause");
	return 0;
}

打印结果:

2.头插法

  • 头插法:从一个空表开始,重复读入数据,生成新节点,将读入的数据域存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直至读入结束为止

其中如下图所示 头插法的核心代码是:

now->next = head;  //将头节点,赋值给新创建的下一个节点
head = now;     //将新创建的结点的地址赋给头指针的结点

头插法建立单链表的算法如下:

#include <stdio.h>
#include <stdlib.h>
 
struct Test
{
	int data;
    struct Test* next;
 
};
 
void printLink(struct Test* head)  //链表打印检测函数
{	
    struct Test* point;
    point = head;
	while(point!=NULL){
		printf("%d",point->data);
        point = point->next;
    }
}
 
struct Test* insertFromHead(struct Test *head,struct Test *now)  //头插法处理函数
{
	if(head == NULL){      //判断head是否创建有节点
		head = now;
    }else{
		now->next = head;  //将头节点,赋值给新创建的下一个节点
        head = now;     //将新创建的结点的地址赋给头指针的结点
    }
    return head;        //返回头节点
}
 
struct Test* creatLink(struct Test *head)
{
	struct Test *now;
    while(1){
		now = (struct Test*)malloc(sizeof(struct Test)); //创建新节点,并开辟空间
        now->next = NULL;
        printf("input");
        scanf("%d",&now->data);
         
        if(now->data == 0){    //退出链表的创建
			printf("0退出\n");
            free(now);
            return head;
        }
        head = insertFromHead(head,now);  //调用函数循环插入节点
    }
}
 
int main()
{
	struct Test* head=NULL;
    head = creatLink(head);
    printLink(head);
	system("pause");
	return 0;
}

打印结果:

C语言是一种通用的高级编程语言,它广泛应用于系统软件、应用软件、嵌入式系统、游戏开发等领域。C语言的特点是简洁、高效、可移植性强,同时也具有较高的灵活性和可扩展性。 尾插法单向链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。尾插法单向链表的特点是可以在链表的末尾添加新的节点,而不需要遍历整个链表。 下面是一个简单的C语言尾插法单向链表的实现示例: ```c #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; // 定义链表节点结构体 typedef struct Node { int data; struct Node *next; } Node; // 定义链表结构体 typedef struct List { Node *head; Node *tail; } List; // 初始化链表 void initList(List *list) { list-&gt;head = NULL; list-&gt;tail = NULL; } // 在链表末尾插入节点 void insertNode(List *list, int data) { Node *node = (Node*)malloc(sizeof(Node)); node-&gt;data = data; node-&gt;next = NULL; if (list-&gt;head == NULL) { list-&gt;head = node; list-&gt;tail = node; } else { list-&gt;tail-&gt;next = node; list-&gt;tail = node; } } // 打印链表 void printList(List *list) { Node *node = list-&gt;head; while (node != NULL) { printf(&quot;%d &quot;, node-&gt;data); node = node-&gt;next; } printf(&quot;\n&quot;); } int main() { List list; initList(&amp;list); insertNode(&amp;list, 1); insertNode(&amp;list, 2); insertNode(&amp;list, 3); printList(&amp;list); return 0; } ``` 以上代码中,我们定义了一个链表结构体和一个节点结构体,然后实现了初始化链表、在链表末尾插入节点和打印链表的函数。在主函数中,我们创建了一个链表并插入了三个节点,后打印出链表中的所有节点数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值