学习目标:
初步认识动态链表,并会最基础的应用。
题目内容:
写个程序,输入a,b,c
如果a>b,a=a➖b
b>c,b=b➖c
c>a,c=c➖a
要求:开始时输入k➕1行数,第一行为k,代表数的组数,下面每一行为一个组,每组四个数,前三个为a,b,c,最后一个为这组数进行上述计算的次数
题目特点分析:
开始时输入的k值不确定,不能直接定义一个数组。程序中数据所占空间与未知数k相关,因此需要动态开辟空间。
技术分析:
何为链表:
创建一个结构体,让该结构体里面含有结构体指针变量,该指针变量指向下一个结构体,进而使一个结构体后面连着另一个结构体......从而形成链表。就像一个车厢拉着另一个,连成一长串。
何为动态链表:
普用静态链表所占空间是确定的,也就是说结构体的数量是确定的。但动态链表引用malloc函数,能够开辟空间,这样就能再为新增的结构体开辟位置。
本题中就需要k个结构体,结构体的数量是不定的,所以需要用到动态链表。
题目书写
#include<stdio.h>
#include<stdlib.h>
struct abcd
{
int a, b, c, d;
struct abcd* next;
};
int main()
{
struct abcd* head = (struct abcd*)malloc(sizeof(struct abcd));
struct abcd* tail = head;
head->a = 4; head->b = 3; head->c = 2; head->d = 1; head->next = NULL;
int i, k;
printf("请输入");
scanf_s("%d", &k);
while (k)
{
k--;
struct abcd* new1 = (struct abcd*)malloc(sizeof(struct abcd));
scanf_s("%d %d %d", &(new1->a), &(new1->b), &(new1->c));
i = 0;
while (new1->a > new1->b || new1->b > new1->c)
{
i++;
if (new1->a > new1->b)
new1->a -= new1->b;
if (new1->b > new1->c)
new1->b -= new1->c;
}
new1->d = i;
new1->next = NULL;
tail->next = new1;
tail = new1;
}
while (head->next != NULL)
{
head = head->next;
printf("%d %d %d %d\n", head->a, head->b, head->c, head->d);
}
return 0;
}
题目讲解:
首先malloc函数在stdlib头文件中。
然后创建结构体,结构体里面含有结构体指针,为了指向下一个结构体。
在链表里边开头的结构体位置非常重要,当你知道开头的位置,你就可以一步步推出后面所有内容。我写的这个head结构体里面的内容是随便填写的,而且下面也没有输出,单纯就是为了标记链表表头的位置。
struct abcd* new1 = (struct abcd*)malloc(sizeof(struct abcd));这一句是动态链表的关键,这个new1就是接收我们传入的那k行数字的结构体,接收后,再把new1位置放到tail后边.....
最后就是输出数据,我们的练习题就做完啦!
小结:
希望通过这个简单的例子,大家能学到动态链表的使用。有问题和建议的,欢迎评论区留言,有修改意见的,欢迎私信我,一起进步啦!
标签:abcd,head,struct,C语言,链表,易懂,new1,结构 From: https://blog.csdn.net/2301_81033986/article/details/136814197