鱼C论坛

 找回密码
 立即注册
查看: 2186|回复: 17

求助(段错误)

[复制链接]
发表于 2021-9-20 23:24:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 三刀流.索隆 于 2021-9-20 23:26 编辑

就是程序运行不了,老提示段错误(核心已转储)

  1. /********************/
  2. /***功能:符号三角形**/
  3. /***日期:2021.9.20****/
  4. /*******************/

  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. struct Queue
  8. {
  9.         char data;
  10.         struct Queue *next;
  11. };
  12. typedef struct Queue Qnode;

  13. typedef struct
  14. {
  15.         Qnode *front,*rear;
  16. }Queue;

  17. void InitQueue(Queue *s);
  18. void InsertQueue(Queue *s,char e);
  19. void DeleteQueue(Queue *s,char *e);

  20. int main()
  21. {
  22.                 Queue s;
  23.                 Qnode* ptr1,*ptr2;
  24.                 char c;
  25.                 int i = 0,j = 0,mem;
  26.                
  27.                 printf("请合法输入-或+,#表示结束输入:");
  28.                 InitQueue(&s);
  29.                 scanf("%c",&c);

  30.                 while (c != '#')             //入队操作,#表示结束
  31.                 {
  32.                         InsertQueue(&s,c);
  33.                         i++;        
  34.                         scanf("%c",&c);
  35.                 }
  36.                
  37.                 //while ()
  38.                 printf("\n正在生成三角形...");

  39.                 ptr1 = s.front->next;
  40.                 ptr2 = s.rear;

  41.                 while (ptr1 != s.rear)      //遍历队列,并生成新节点,直到ptr1指针等于队尾
  42.                
  43.                         if (ptr1 == ptr2)
  44.                         {
  45.                                 ptr2 = s.rear;
  46.                                 ptr1 = ptr1->next;
  47.                         }
  48.                         if (ptr1->data == ptr1->next->data)
  49.                         {
  50.                                 InsertQueue(&s,'+');
  51.                         }
  52.                         else
  53.                         {
  54.                                 InsertQueue(&s,'-');
  55.                         }

  56.                         ptr1 = ptr1->next;
  57.                 }
  58.                         
  59.                 printf("\n即将为您打印三角形...\n");         //规律打印队列
  60.                 for (mem = i;mem >= 0;mem--,i = mem,j++)
  61.                 {
  62.                         for (;i >= 0;i--)
  63.                         {        
  64.                                 DeleteQueue(&s,&c);
  65.                                 printf("%c ",c);
  66.                         }
  67.                         printf("\n");
  68.                         for (;j >= 0;)
  69.                         {
  70.                                 printf(" ");
  71.                         }
  72.                
  73.                 }
  74.                 return 0;
  75.         }

  76. void InitQueue(Queue *s)//初始化队列函数
  77. {
  78.         s->front = s->rear = (Qnode*)malloc(sizeof(Qnode));
  79.         if (s->front == NULL)
  80.         {
  81.                 printf("内存分配失败!!!\n");
  82.                 exit(0);
  83.         }
  84.         s->rear->next = NULL;
  85. }

  86. void InsertQueue(Queue *s,char e)//入队函数
  87. {
  88.         //if (s->rear - s->front == maxSize)
  89.         //        s->front = (Qnode*)realloc(s->rear,maxSize * sizeof(Qnode));

  90.         s->rear->next = (Qnode*)malloc(sizeof(Qnode));
  91.         if (s->rear->next == NULL)
  92.         {
  93.                 printf("错误!");
  94.                 exit(0);
  95.         }
  96.         s->rear = s->rear->next;
  97.         s->rear->data = e;
  98.         s->rear->next = NULL;
  99. }

  100. void DeleteQueue(Queue *s,char *e)//出队函数
  101. {
  102.         Qnode *temp = s->front;
  103.         s->front = s->front->next;
  104.         *e = (s->front->data);
  105.         free(temp);
  106. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-21 07:38:47 | 显示全部楼层
两个结构体名一样
  1. struct Queue
  2. {
  3.         char data;
  4.         struct Queue *next;
  5. };
  6. typedef struct Queue Qnode;

  7. typedef struct
  8. {
  9.         Qnode *front,*rear;
  10. }Queue;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 09:23:17 | 显示全部楼层
jhq999 发表于 2021-9-21 07:38
两个结构体名一样
  1. struct Node
  2. {
  3.         char data;
  4.         struct Node *next;
  5. };
  6. typedef struct Node Qnode;

  7. typedef struct
  8. {
  9.         Qnode *front,*rear;
  10. }Queue;
复制代码

//改成这样还是一样的错啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 10:09:22 | 显示全部楼层
三刀流.索隆 发表于 2021-9-21 09:23
//改成这样还是一样的错啊

  1. while (ptr1 != s.rear)      //遍历队列,并生成新节点,直到ptr1指针等于队尾
  2. {\\你缺个{
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 14:04:10 | 显示全部楼层

可能是因为发帖的时候不小心弄的,编译器里的代码是好的,运行时唯一的报错就是段错误的问题,话说段错误的原因有哪些啊,我可以一个一个排查的,弄清楚了问题的原因,基本就能找到解决方法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 14:29:46 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 14:31:46 | 显示全部楼层
提供一下这个程序的输入,和输出(你期望的输出,正确的输出)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 17:04:02 | 显示全部楼层
人造人 发表于 2021-9-21 14:31
提供一下这个程序的输入,和输出(你期望的输出,正确的输出)


https://fishc.com.cn/thread-27518-1-1.html

就是小甲鱼的数据结构的一个练习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 17:08:05 | 显示全部楼层
三刀流.索隆 发表于 2021-9-21 17:04
https://fishc.com.cn/thread-27518-1-1.html

就是小甲鱼的数据结构的一个练习

你直接提供一个输入和输出就可以了
这个程序的输入是什么?这样?
1 2 3 4 #
如果是这个输入,输出是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 17:10:23 | 显示全部楼层
本帖最后由 三刀流.索隆 于 2021-9-21 17:15 编辑
人造人 发表于 2021-9-21 17:08
你直接提供一个输入和输出就可以了
这个程序的输入是什么?这样?
1 2 3 4 #


输入:++-+-++#,就是输入一串+和-
输出:+ + - + - + +
           + - -  - - +
            - + + + -
             -  + + -
               - + -
                -  -
                 +
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 17:11:31 | 显示全部楼层
好了,知道输入输出了,我研究研究
输入: ++-+-++
输出:
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 17:18:56 | 显示全部楼层
人造人 发表于 2021-9-21 17:11
好了,知道输入输出了,我研究研究
输入: ++-+-++
输出:

规律就是:+ +    |          - -      |             - +           |         + -
                  -       |          +       |              -             |           -

符号相同在下面输出+,不同为-,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 20:53:58 | 显示全部楼层
三刀流.索隆 发表于 2021-9-21 17:18
规律就是:+ +    |          - -      |             - +           |         + -
                   ...

1. 你的代码逻辑不对
2. 申请了内存一定要释放,不释放在一些环境下会报错的
3. 模块化编程,不要在 queue 函数的外面操作 queue 的内部数据结构

  1. /********************/
  2. /***功能:符号三角形**/
  3. /***日期:2021.9.20****/
  4. /*******************/

  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. struct node_tag {
  8.     char data;
  9.     struct node_tag *next;
  10. };

  11. typedef struct node_tag Qnode;

  12. typedef struct {
  13.     Qnode *front, *rear;
  14.     size_t size;
  15. } Queue;

  16. void InitQueue(Queue *s);
  17. void InsertQueue(Queue *s, char e);
  18. void DeleteQueue(Queue *s, char *e);
  19. size_t queue_size(Queue *s);
  20. void queue_deinit(Queue *s);
  21. void queue_undelete(Queue *s, char e);
  22. void queue_uninsert(Queue *s, char *e);

  23. int main() {
  24.     Queue s;
  25.     //Qnode *ptr1, *ptr2;
  26.     char c;
  27.     //int i = 0, j = 0, mem;

  28.     printf("请合法输入-或+,#表示结束输入:");
  29.     InitQueue(&s);
  30.     scanf("%c", &c);

  31.     while (c != '#') //入队操作,#表示结束
  32.     {
  33.         InsertQueue(&s, c);
  34.         //i++;
  35.         scanf("%c", &c);
  36.     }

  37.     /*
  38.     // while ()
  39.     printf("\n正在生成三角形...");

  40.     ptr1 = s.front->next;
  41.     ptr2 = s.rear;

  42.     while (ptr1 != s.rear) //遍历队列,并生成新节点,直到ptr1指针等于队尾
  43.     {
  44.         if (ptr1 == ptr2) {
  45.             ptr2 = s.rear;
  46.             ptr1 = ptr1->next;
  47.         }
  48.         if (ptr1->data == ptr1->next->data) {
  49.             InsertQueue(&s, '+');
  50.         } else {
  51.             InsertQueue(&s, '-');
  52.         }

  53.         ptr1 = ptr1->next;
  54.     }

  55.     printf("\n即将为您打印三角形...\n"); //规律打印队列
  56.     for (mem = i; mem >= 0; mem--, i = mem, j++) {
  57.         for (; i >= 0; i--) {
  58.             DeleteQueue(&s, &c);
  59.             printf("%c ", c);
  60.         }
  61.         printf("\n");
  62.         for (; j >= 0;) {
  63.             printf(" ");
  64.         }
  65.     }
  66.     */
  67.     size_t width = queue_size(&s);
  68.     size_t height = width;
  69.     for(size_t y = 0; y < height; ++y) {
  70.         size_t i = y;
  71.         while(i--) printf(" ");
  72.         for(size_t x = 0; x < width - y; ++x) {
  73.             char a, b, c = '-';
  74.             DeleteQueue(&s, &a);
  75.             DeleteQueue(&s, &b);
  76.             queue_undelete(&s, b);
  77.             if(a == b) c = '+';
  78.             InsertQueue(&s, c);
  79.             printf("%c ", a);
  80.         }
  81.         char e;
  82.         queue_uninsert(&s, &e);
  83.         printf("\n");
  84.     }
  85.     queue_deinit(&s);       // 释放函数一定要写
  86.     return 0;
  87. }

  88. void InitQueue(Queue *s) //初始化队列函数
  89. {
  90.     s->front = s->rear = (Qnode *)malloc(sizeof(Qnode));
  91.     if (s->front == NULL) {
  92.         printf("内存分配失败!!!\n");
  93.         exit(0);
  94.     }
  95.     s->rear->next = NULL;
  96.     s->size = 0;
  97. }

  98. void InsertQueue(Queue *s, char e) //入队函数
  99. {
  100.     // if (s->rear - s->front == maxSize)
  101.     //        s->front = (Qnode*)realloc(s->rear,maxSize * sizeof(Qnode));

  102.     s->rear->next = (Qnode *)malloc(sizeof(Qnode));
  103.     if (s->rear->next == NULL) {
  104.         printf("错误!");
  105.         exit(0);
  106.     }
  107.     s->rear = s->rear->next;
  108.     s->rear->data = e;
  109.     s->rear->next = NULL;
  110.     ++s->size;
  111. }

  112. void DeleteQueue(Queue *s, char *e) //出队函数
  113. {
  114.     /*
  115.     Qnode *temp = s->front;
  116.     s->front = s->front->next;
  117.     *e = (s->front->data);
  118.     free(temp);
  119.     */
  120.     if(queue_size(s) == 0) return;
  121.     Qnode *temp = s->front->next;
  122.     s->front->next = s->front->next->next;
  123.     *e = temp->data;
  124.     free(temp);
  125.     if(--s->size == 0) {
  126.         s->rear = s->front;
  127.     }
  128. }

  129. size_t queue_size(Queue *s) {
  130.     return s->size;
  131. }

  132. void queue_deinit(Queue *s) {
  133.     char e;
  134.     while(queue_size(s) != 0) DeleteQueue(s, &e);
  135.     free(s->front);
  136. }

  137. void queue_undelete(Queue *s, char e) {
  138.     Qnode *temp = malloc(sizeof(*temp));
  139.     temp->data = e;
  140.     temp->next = s->front->next;
  141.     s->front->next = temp;
  142.     if(s->size++ == 0) {
  143.         s->rear = temp;
  144.     }
  145. }

  146. void queue_uninsert(Queue *s, char *e) {
  147.     if(queue_size(s) == 0) return;
  148.     Qnode *prev = s->front;
  149.     while(prev->next != s->rear) prev = prev->next;
  150.     s->rear = prev;
  151.     free(s->rear->next);
  152.     s->rear->next = NULL;
  153.     --s->size;
  154. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 22:45:37 | 显示全部楼层
人造人 发表于 2021-9-21 20:53
1. 你的代码逻辑不对
2. 申请了内存一定要释放,不释放在一些环境下会报错的
3. 模块化编程,不要在 qu ...

牛逼啊,果然是神仙,嗯~ o(* ̄▽ ̄*)o,我还想问一下,你用的是什么编译器啊,太舒服了吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 22:48:10 | 显示全部楼层
三刀流.索隆 发表于 2021-9-21 22:45
牛逼啊,果然是神仙,嗯~ o(* ̄▽ ̄*)o,我还想问一下,你用的是什么编译器啊,太舒服了吧~

vim
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 22:55:42 | 显示全部楼层

咦,怎么弄的呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-21 23:25:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-1 20:06:33 | 显示全部楼层
  1. #include <stdio.h>

  2. int count = 1;
  3. int notDanger(int row,int j,int (*chess)[8])
  4. {
  5.         int i,k,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0;
  6.        
  7.         //列
  8.         for (i = 0;i < 8;i++)
  9.         {
  10.                 if (*(*(chess+i)+j) != 0)
  11.                 {
  12.                         flag1 = 1;
  13.                         break;
  14.                 }
  15.         }

  16.         //左上方
  17.         for(i = row,k = j;i >= 0 && k >= 0;i--,k--)
  18.         {
  19.                 if (*(*(chess+i)+k) != 0)
  20.                 {
  21.                         flag2 = 1;
  22.                         break;
  23.                 }
  24.         }

  25. //        右下方
  26.         for(i = row,k = j;i < 8 && k < 8;i++,k++)
  27.         {
  28.                 if (*(*(chess+i)+k) != 0)
  29.                 {
  30.                         flag3 = 1;
  31.                         break;
  32.                 }
  33.         }
  34.        
  35.         //
  36.         for(i = row,k = j;i >= 0 && k < 8;i--,k++)
  37.         {
  38.                 if (*(*(chess+i)+k) != 0)
  39.                 {
  40.                         flag4 = 1;
  41.                         break;
  42.                 }
  43.         }
  44.        
  45.         for(i = row,k = j;i < 8 && k >= 0;i++,k--)
  46.         {
  47.                 if (*(*(chess+i)+k) != 0)
  48.                 {
  49.                         flag5 = 1;
  50.                         break;
  51.                 }
  52.         }
  53.        
  54.         if (flag1||flag3||flag2||flag4||flag5)
  55.                 return 0;
  56.         else
  57.                 return 1;
  58. }
  59. //row:起始行,
  60. //n:列数
  61. //(*chess)[8]:指向每一行的指针
  62. void EightQueen(int row,int n,int (*chess)[8])
  63. {
  64.         int chess2[8][8],i,j;

  65.         for (i = 0;i < 8;i++)
  66.         {
  67.                 for (j = 0;j < 8;j++)
  68.                 {
  69.                         chess2[i][j] = chess[i][j];
  70.                 }

  71.         }

  72.         if (8 == row)
  73.         {
  74.                 printf("第%d种:\n",count);
  75.                 for(i = 0;i < 8;i++)
  76.                 {
  77.                         for (j = 0;j < 8; j++)
  78.                         {
  79.                                 printf("%d ",*(*(chess2+i)+j));
  80.                         }
  81.                         printf("\n");
  82.                 }
  83.                 printf("\n");
  84.                 count++;
  85.         }
  86.         else
  87.         {
  88.                 for (j = 0; j < n;j++)
  89.                 {
  90.                         if (notDanger(row,j,chess2))
  91.                         {
  92.                                 for(i = 0;i < 8;i++)
  93.                                 {
  94.                                         *(*(chess2+row)+i) = 0;
  95.                                 }
  96.                                
  97.                                 *(*(chess2+row)+j) = 1;
  98.                                 EightQueen(row+1,n,chess2);
  99.                         }
  100.                 }
  101.         }
  102. }

  103. int main()
  104. {
  105.         int chess[8][8],i,j;
  106.        
  107.         for (i = 0;i < 8;j++)
  108.         {
  109.                
  110.                 for (j = 0;j < 8;j++)
  111.                 {
  112.                         chess[i][j] = 0;
  113.                 }
  114.         }

  115.         EightQueen(0,8,chess);
  116.         printf("总共有%d种解决方法!\n\n",count);
  117.        
  118.         return 0;
  119. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 08:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表