关于#数据结构#的问题:画出该代码的函数算法流程图(语言-c语言)


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  |    |        |
   +-----------+  +-----------+    +--------+


img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7602928
  • 你也可以参考下这篇文章:数据结构与算法:循环队列实现代码(C语言)
  • 除此之外, 这篇博客: 算法-数塔问题-c语言中的 代码实现(c语言) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #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;
    }
    
  • 您还可以看一下 朱有鹏老师的宏定义与预处理、函数和函数库-C语言专题第6部分课程中的 4.6.1.C语言预处理理论小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考代码,我们可以画出以下的函数算法流程图。

    方法一的函数算法流程图如下:

    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的下一个节点