void insert1()
{
int linenum;
printf("\t\t输入插入位置的行号:");
scanf("%d", &linenum);
struct line * info, * q, * p;
p = start;
q = NULL;
while (p && p->num != linenum)
{
q = p; //插入行前面一行
p = p->next; //插入行后面一行
}
if (p == NULL && (q->num + 1) != linenum) //指定行不存在,不能插入
{
printf("\t\t输入的行号不存在");
}
else // 指定行存在,进行插入
{
info = (struct line *)malloc(sizeof(struct line));
printf("\t\t输入要插入的字符串:");
scanf("%s", info->text);
info->num = linenum;
if (linenum == 1) //插入在第一行
{
info->next = p;
p->prior = info;
info->prior = NULL;
start = info;
}
else if (q->num != linenum) //插入在最后一行
{
q->next = info;
info->next = p;
info->prior = q;
}
else //插入在其他行
{
q->next = info;
info->next = p;
p->prior = info;
info->prior = q;
}
while (p) //如果不是插入在最后一行,插入行后面的行号都加1
{
p->num = p->num + 1;
p = p->next;
}
}
}
画出该代码的函数算法流程图
给定代码的函数算法流程图:
+--------------------------------------+
| insert1() |
+--------------------------------------+
|
+----v-----+
| linenum |
+----+-----+
|
+-----v-----+
| printf() |
+-----+-----+
|
+-----v-----+
| scanf() |
+-----+-----+
|
+-------v---------+
| struct line * |
| info, q, p |
+-------+---------+
|
+-----v-----+
| p = start |
| q = NULL |
+-----+-----+
|
+-------v--------+
| while (p && |
| p->num != linenum)|
+-------+--------+
|
+-----v-----+
| q = p |
| p = p->next|
+-----+-----+
|
+--------------|--------------+
| | |
+-------v----+ +----v-----+ +---v----+
| p == NULL | | q->num != | | else |
| && (q-> | | linenum | | |
| num + 1) | | | | |
| != linenum)| +----+-----+ +---+----+
+-------+----+ | |
| | |
+-------v----+ +----v-----+ +---v----+
| printf() | | printf() | | printf()|
+-------+----+ +----+-----+ +---+----+
| | |
+-------v----+ +----v-----+ +---v----+
| malloc() | | scanf() | | scanf()|
+-------+----+ +----+-----+ +---+----+
| | |
+-------v----+ +----v-----+ +---v----+
| info->text | | info->num | |linenum==|
| | | | | 1 |
+-------+----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
|linenum!= | | q->next | | q->next |
| linenum | | | | = |
+----+-----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
| q->next | | info-> | | info-> |
| | | next | | next |
+----+-----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
| p->prior | | info-> | | p-> |
| | | prior | | prior |
+----+-----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
| info-> | | start | | |
| prior | | | | |
+----+-----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
| while | |p->num = | | |
| | |p->num +1 | | |
+----+-----+ +----+-----+ +---+----+
| | |
+----v-----+ +----v-----+ +---v----+
| p = p-> | | p = | | |
| next | | p->next | | |
+-----------+ +-----------+ +--------+
#include <stdio.h>
#include <stdlib.h>
int maxdata(int data1,int data2)
{
if(data1>data2)
return data1;
else
return data2;
}
int main()
{
int node;
int op[5][5]={0};//将其初始化为0
int data[5][5]={
9, 0, 0, 0, 0,
12,15, 0, 0, 0,
10, 6, 8, 0, 0,
2,18, 9, 5, 0,
19, 7,10, 4,16};
int n=5,i,j,temp=0;//n为第几层
for(j=0;j<n;j++)
{
op[n-1][j]=data[n-1][j];
}//初始化op数据,data最底层赋值给op最底层;其余还是为0
for(i=3;i>=0;i--)//从data[3][0]开始,也就是2;比较19和7
{
for(j=0;j<=i;j++)
{
temp=maxdata(op[i+1][j],op[i+1][j+1]);
op[i][j]=temp+data[i][j];
}
}
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
printf("%d ",op[i][j]);
}
printf("\n");
}
printf("路径之和最大为:%d\n",op[0][0]);
printf("最大路径:%d",data[0][0]);
for(i=1,j=0;i<n;i++)
{
node=op[i-1][j]-data[i-1][j];
if(node==op[i][j+1])
++j;
printf("——>%d",data[i][j]);
}
return 0;
}
根据提供的参考代码,我们可以画出以下的函数算法流程图。
方法一的函数算法流程图如下:
start: Print_z(n)
|
n < 10 ?
| |
| yes
| |
| print n
|
no
|
Print_z(n / 10)
|
print n % 10
|
end
方法二的函数算法流程图如下:
start: print(n)
|
n > 9 ?
| |
| yes
| |
| print(n / 10)
|
print(n % 10)
|
end
函数print_xh
的算法流程图如下:
start: print_xh(n)
|
n != 0 ?
| |
| yes
| |
| print n % 10
| |
| n = n / 10
|
end
这些流程图描述了代码的执行流程,可以帮助我们更好地理解和分析代码的逻辑。
等我有空可以画一下
可以画
C语言实现数据结构:图
现成的,可以参考下
https://blog.csdn.net/John_bill/article/details/130002703
你的程序,实现的流程大致如下:
开始
输入插入位置的行号:
初始化变量
- linenum:插入位置的行号
- info:新插入的行信息
- q:插入行前面一行的指针
- p:插入行后面一行的指针
定位插入位置
- 遍历链表,找到插入位置的前一行和后一行
检查插入行是否存在
- 如果插入行不存在,输出提示信息并结束程序
创建新插入的行信息
- 使用malloc分配内存,创建新的行信息
- 从用户输入中读取要插入的字符串
- 设置新行的行号
插入新行
- 根据插入位置,设置新行的指针关系
- 如果插入在第一行
+ 设置新行的指针关系,使其成为新的起始节点
- 如果插入在最后一行
+ 设置新行的指针关系,使其成为最后一行的后继节点
- 如果插入在其他行之间
+ 设置新行的指针关系,使其插入到链表中
- 更新链表中的行号,将其后面的行号都加1
结束程序
- insert1()
- 输入插入位置的行号
- 定义变量linenum
- 定义结构体指针info, q, p
- 将p指向start, q置空
- 循环遍历链表,直到找到插入位置或到达链表末尾
- 如果p不为空且p的行号不等于linenum
- 将q指向p的前一个节点
- 将p指向p的下一个节点
- 如果p为空且q的行号加1不等于linenum
- 输出提示信息:输入的行号不存在
- 否则,插入行存在,进行插入操作
- 分配内存给info
- 输入要插入的字符串到info的text中
- 将linenum赋值给info的num
- 如果linenum等于1
- 将info的next指向p
- 将p的prior指向info
- 将info的prior置空
- 将start指向info
- 否则,如果q的行号不等于linenum
- 将q的next指向info
- 将info的next指向p
- 将info的prior指向q
- 否则,插入在其他行
- 将q的next指向info
- 将info的next指向p
- 将p的prior指向info
- 将info的prior指向q
- 循环遍历链表p
- 将p的行号加1
- 将p指向p的下一个节点