头插法创建无头链表并完成链表基本操作

头插法创建无头链表并完成链表基本操作

运行截图: 在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};//定义一个结构体

/函数声明/
typedef struct node ListNode;//给这个结构体重命名为ListNode
typedef struct node* LinkList;//定义一个结构体指针并且重命名为LinkList
LinkList head;//定义一个全局变量头指针
LinkList creatList(LinkList head);//创建无头链表的函数声明
void printAll(LinkList head,LinkList temp);//打印无头链表函数声明
LinkList findByValue(LinkList head, int key);//按值查找函数声明
LinkList deleteByValue(LinkList head, int valueDelete);//按值删除函数声明
void deleteAll(LinkList head);//清空链表函数声明

/主函数/
int main()
{
int key, valueDelete;
LinkList pKey;
head = creatList(head);//使用头插法创建一个无头链表
if( head != NULL)
{
LinkList temp = head;//保护头指针不被改变
printAll(head,temp);//打印链表
printf("\n");
printf(“请输入要查找的值:\n”);
scanf("%d", &key);
pKey = findByValue(head, key);//按值查找,返回地址
if(pKey != NULL)
{
printf(“这个值的地址是:\n%d\n”, pKey);
}
else
{
printf(“链表中没有值为%d的节点\n”,key);
}
printf(“请输入要删除的值:\n”);
scanf("%d", &valueDelete);
head = deleteByValue(head, valueDelete);//按值删除
temp = head;//保护头指针不被改变
printAll(head,temp);
printf("\n");
deleteAll(head);//删除所有节点,释放空间
}
else
{
printf(“错误:您创建的链表为空表\n”);//输出空表提示
}
getchar();//吸收缓存,避免闪退
return 0;
}

/头插法创建无头链表/
LinkList creatList(LinkList head)//创建一个无头节点的单向链表,使用头插法
{
int x, n;
LinkList p;//创建一个结构体指针
printf(“请输入无头链表的长度:\n”);
scanf("%d", &n);//自定义链表的长度
if(n==0)//如果是空表,返回头指针为NULL
{
head=NULL;
return head;
}
head = (LinkList)malloc(sizeof(ListNode));//创建第一个节点,并且将head指针指向它
printf(“请输入一个正整数存入节点:\n”);
scanf("%d", &x);//无头链表,第一个节点可以存储数据
head->data = x;
head->next = NULL;//养成好习惯,指针定义时先指向NULL,需要时在进行赋值操作

for (int i = 1; i < n; i++)//循环创建接下来的n-1个节点
{
	p = (LinkList)malloc(sizeof(ListNode));//分配空间,创建节点
	printf("请输入一个正整数存入节点:\n");
	scanf("%d", &x);
	p->data = x;//给节点赋值
	p->next = NULL;//养成好习惯
	p->next=head;//将p连接到第一个节点
	head = p;//始终将头指针指向链表的尾节点
}
return head;

}

/逆序打印链表/
void printAllReverse(LinkList head,LinkList temp)//用递归按逆序打印所有节点中的data
{
if (temp != NULL)//遍历,一直到链表尾
{
printAll(head, temp->next);//调用自己
printf("%d", temp->data);//操作在后面,也就是逆序
}
}

/正序打印链表/
void printAll(LinkList head,LinkList temp)//用递归按正序打印所有节点中的data
{
if (temp != NULL)//遍历,一直到链表尾
{
printf("%d", temp->data);//操作在前面,正序打印
printAll(head, temp->next);//调用自己

}

}

/按值查找,返回该值的地址/
LinkList findByValue(LinkList head, int key)//按值查找,返回地址
{
LinkList p;
p = head;
while (p != NULL)//遍历,一直到链表尾
{
if (p->data == key)//找到这个值所在地
{
return p;//返回这个值的地址
}
else
{
p = p->next;//没找到,继续遍历
}
}
return NULL;//如果没有这个值,返回NULL
}

/按值删除/
LinkList deleteByValue(LinkList head, int valueDelete)
{
LinkList left, right;
left = head;
right = head->next;
if (left->data == valueDelete)//判断第一个节点是否是需要删除的节点
{
head = right;
free(left);//删除第一个节点
}
else
{
while (right != NULL)
{
if (right->data == valueDelete)//找寻到节点
{
left->next = right->next;//删除前的准备
free(right);//删除节点
right = left->next;
break;//跳出循环
}
else
{
right = right->next;
left = left->next;
}
}
}
return head;//返回更新后的链表的头指针
}
/删除所有节点,释放空间/
void deleteAll(LinkList head)//删除所有节点,释放空间
{
LinkList p, q;
p = head;//保护头指针
while (p != NULL)
{
q = p->next;//保护p用来继续遍历
free§;
p = q;
}
head->next=NULL;//清空是链表的头还在,可以继续插入节点
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值