单向链表 尾插法
#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;
}
上一篇: 自动备份Oracle数据库
下一篇: 《PHP核心技术与最佳实践》笔记