算法学习 2.4——链表

前言:在存储一大波数的时候我们通常用的是数组,但有时候数组显得不太灵活
例如:从小到大排好的一串数字:2 3 5 8 9 10 18 26 32,我们要插入6使得其顺序依然不变,如果用数组的话就要让8以及8往后的数都要往后挪一位,很浪费时间,但如果用链表操作只需要将5的指针指向6的指针,再将6的指针指向8,这样一组数字就串起来啦!
(对指针不了解的朋友建议学习链表之前先了解指针)
—————————————————————————————————

  1. 链表是由一种叫做节点的结构体类型构成的。
  2. 下面我们来进行操作。在链表中输入n个数,并将其输出:
#include <stdio.h>
#include<stdlib.h> //使用malloc函数需要用到的头文件

struct node
{
	int data;
	struct node *next;
};
struct stack
{
	int data[10];
	int top;
};

int main()
{
	struct node *head, *p, *q, *t;
	int i, n, a;
	printf("请输入数据个数:");
	scanf("%d", &n);
	printf("\n");
	head = NULL;//头节点为空
	printf("请输入数据:");
	for (i = 1; i <= n; i++)//循环读入n个数
	{
		scanf("%d", &a);
		//动态申请一个空间,用来存放一个节点,并且临时指针p指向这个节点
		p = (struct node*)malloc(sizeof(struct node));
		p->data = a;//将数据存放在当前节点的data域中
		p->next = NULL;//设置当前节点的后继指针指向空,也就是当前节点的下一节点为空
		if (head == NULL)
		{
			head = p;//如果这是第一个创建的节点,则头指针指向这一节点
		}
		else
		{
			q->next = p;//如果这不是第一个节点,则上一节点的后继指针指向该节点

		}
		q = p;//指针q也指向该节点
	}
	printf("\n");
	t = head;
	//输出链表中的所有数
	printf("链表中的数据为:");
	while (t != NULL)
	{
		printf(" %d", t->data);
		t = t->next;//继续指向下一个节点
	}
	return 0;
}

结果:
在这里插入图片描述

  1. 插入操作代码:

在上述代码中新增的代码是:

	printf("请输入插入的数:");
	scanf("%d", &a);//读入待插入的数
	printf("\n");
	t = head;//从链表的头部开始遍历
	while (t != NULL)
	{
		if (t->next == NULL || t->next->data > a)//如果当前一个节点 是最后一个节点或者下一个节点的值大于待插入数的时候插入
		{
			p = (struct node*)malloc(sizeof(struct node));//动态申请一个空间,用来存放新的节点
			p->data = a;
			p->next = t->next;//新增节点的后继指针指向当前节点的后继指针所指向的节点
			t->next = p;//当前节点的后继指针指向新增节点
			break;//插入完毕退出
		}
		t = t->next;//继续下一个节点
	}
  1. 完整代码:
#include <stdio.h>
#include<stdlib.h> //使用malloc函数需要用到的头文件

struct node
{
	int data;
	struct node *next;
};
struct stack
{
	int data[10];
	int top;
};

int main()
{
	struct node *head, *p, *q, *t;
	int i, n, a;
	printf("请输入数据个数:");
	scanf("%d", &n);
	printf("\n");
	head = NULL;//头节点为空
	printf("请输入数据:");
	for (i = 1; i <= n; i++)//循环读入n个数
	{
		scanf("%d", &a);
		//动态申请一个空间,用来存放一个节点,并且临时指针p指向这个节点
		p = (struct node*)malloc(sizeof(struct node));
		p->data = a;//将数据存放在当前节点的data域中
		p->next = NULL;//设置当前节点的后继指针指向空,也就是当前节点的下一节点为空
		if (head == NULL)
		{
			head = p;//如果这是第一个创建的节点,则头指针指向这一节点
		}
		else
		{
			q->next = p;//如果这不是第一个节点,则上一节点的后继指针指向该节点

		}
		q = p;//指针q也指向该节点
	}
	printf("\n");
	printf("请输入插入的数:");
	scanf("%d", &a);//读入待插入的数
	printf("\n");
	t = head;//从链表的头部开始遍历
	while (t != NULL)
	{
		if (t->next == NULL || t->next->data > a)//如果当前一个节点 是最后一个节点或者下一个节点的值大于待插入数的时候插入
		{
			p = (struct node*)malloc(sizeof(struct node));//动态申请一个空间,用来存放新的节点
			p->data = a;
			p->next = t->next;//新增节点的后继指针指向当前节点的后继指针所指向的节点
			t->next = p;//当前节点的后继指针指向新增节点
			break;//插入完毕退出
		}
		t = t->next;//继续下一个节点
	}
	//输出链表中的所有数
	t = head;
	printf("链表中的数据为:");
	while (t != NULL)
	{
		printf(" %d", t->data);
		t = t->next;//继续指向下一个节点
	}
	return 0;
}

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值