欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单向链表 尾插法

程序员文章站 2022-05-11 22:25:51
...

#include <stdio.h>
#include <stdlib.h> //malloc函数头文件

//1设计节点(放置数据和指针)不同数据用结构体
//结构体模板
struct node
{
//结构体内容
int data;
struct node* next; //指向下一个节点 ,下一个节点类型为结构体,所以指针类型为struct node*
}; //关键字 结构体模板名称 指针名字
//struct node next ; next为结构体变量,如此定义会陷入死循环

//定义一个函数,初始化链表,栈空间,函数调用后返回一个head指针,随后释放
struct node* init_list(void)
{
//头指针指向堆中的头节点(头节点数据内容为空,只有指针并且指向NULL)
struct node* head=malloc(sizeof(struct node)); // 申请堆空间
//malloc函数申请堆空间失败返回NULL
if(head == NULL)
{
printf(“malloc error\n”);
return NULL;
}
head->next = NULL;
return head;
}

//创建新节点(带数据和指针),调用新函数
struct node* new_node(int data)
{
//申请堆空间
struct node* new=malloc(sizeof(struct node));
if(new == NULL)
{
printf(“malloc error\n”);
return NULL;
}
//数据存入节点当中
new->data = data;
new->next = NULL;

  return new;

}

//将新节点插入到链表末尾(尾插法)
int tail_ins(struct node head,struct node new)
{
struct node* p=head;
while(p->next)
p = p->next;
//将新节点插入到链表末尾
p->next = new;

 return 0;

}
//链表遍历
void show(struct node head)
{
struct node
p = head->next;
while§ // 注意不可以打印头节点内容 为空
{

	 printf("data:%d\n",p->data);//改为p
	 p = p->next;
 }

}

int main(void)

{

//堆里面新建链表并初始化,头指针在栈中,指向头节点
struct node* head=init_list();

	if(head == NULL)
	{
		printf("list init error");
		return -1;         //初始化链表失败结束程序
	}
    
	struct node* new=new_node(2);  //调用函数 新建节点2并返回节点指针new到主函数当中
	if(new == NULL)
  {	
 	printf("new node error\n");
    return -2;	                 //新建节点new node失败结束
  }
 
  
  //将new node 2插入链表末尾
 int ret=tail_ins(head,new);
  if( ret == 0) 
      new =NULL;    
           /* 指定位置插入不行(需要先查找,如果插入失败),如果插入失败还让new=NULL的话,新节点就找不到了。但是头插和尾插是可以的*/    
	 
  
  
   //新建数据3的节点并插入末尾
  new = new_node(3);
  
  ret=tail_ins(head,new);
  if( ret == 0)
	  new =NULL;
  
  //链表遍历
  show(head);
return 0;

}

单向链表 尾插法

单向链表 尾插法