(最详细)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;
}

打印结果:

  • 26
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值