求助(段错误)
本帖最后由 三刀流.索隆 于 2021-9-20 23:26 编辑就是程序运行不了,老提示段错误(核心已转储)
/********************/
/***功能:符号三角形**/
/***日期:2021.9.20****/
/*******************/
#include <stdio.h>
#include <stdlib.h>
struct Queue
{
char data;
struct Queue *next;
};
typedef struct Queue Qnode;
typedef struct
{
Qnode *front,*rear;
}Queue;
void InitQueue(Queue *s);
void InsertQueue(Queue *s,char e);
void DeleteQueue(Queue *s,char *e);
int main()
{
Queue s;
Qnode* ptr1,*ptr2;
char c;
int i = 0,j = 0,mem;
printf("请合法输入-或+,#表示结束输入:");
InitQueue(&s);
scanf("%c",&c);
while (c != '#') //入队操作,#表示结束
{
InsertQueue(&s,c);
i++;
scanf("%c",&c);
}
//while ()
printf("\n正在生成三角形...");
ptr1 = s.front->next;
ptr2 = s.rear;
while (ptr1 != s.rear) //遍历队列,并生成新节点,直到ptr1指针等于队尾
if (ptr1 == ptr2)
{
ptr2 = s.rear;
ptr1 = ptr1->next;
}
if (ptr1->data == ptr1->next->data)
{
InsertQueue(&s,'+');
}
else
{
InsertQueue(&s,'-');
}
ptr1 = ptr1->next;
}
printf("\n即将为您打印三角形...\n"); //规律打印队列
for (mem = i;mem >= 0;mem--,i = mem,j++)
{
for (;i >= 0;i--)
{
DeleteQueue(&s,&c);
printf("%c ",c);
}
printf("\n");
for (;j >= 0;)
{
printf(" ");
}
}
return 0;
}
void InitQueue(Queue *s)//初始化队列函数
{
s->front = s->rear = (Qnode*)malloc(sizeof(Qnode));
if (s->front == NULL)
{
printf("内存分配失败!!!\n");
exit(0);
}
s->rear->next = NULL;
}
void InsertQueue(Queue *s,char e)//入队函数
{
//if (s->rear - s->front == maxSize)
// s->front = (Qnode*)realloc(s->rear,maxSize * sizeof(Qnode));
s->rear->next = (Qnode*)malloc(sizeof(Qnode));
if (s->rear->next == NULL)
{
printf("错误!");
exit(0);
}
s->rear = s->rear->next;
s->rear->data = e;
s->rear->next = NULL;
}
void DeleteQueue(Queue *s,char *e)//出队函数
{
Qnode *temp = s->front;
s->front = s->front->next;
*e = (s->front->data);
free(temp);
} 两个结构体名一样
struct Queue
{
char data;
struct Queue *next;
};
typedef struct Queue Qnode;
typedef struct
{
Qnode *front,*rear;
}Queue; jhq999 发表于 2021-9-21 07:38
两个结构体名一样
struct Node
{
char data;
struct Node *next;
};
typedef struct Node Qnode;
typedef struct
{
Qnode *front,*rear;
}Queue;
//改成这样还是一样的错啊{:10_285:} 三刀流.索隆 发表于 2021-9-21 09:23
//改成这样还是一样的错啊
while (ptr1 != s.rear) //遍历队列,并生成新节点,直到ptr1指针等于队尾
{\\你缺个{
jhq999 发表于 2021-9-21 10:09
可能是因为发帖的时候不小心弄的,编译器里的代码是好的,运行时唯一的报错就是段错误的问题,话说段错误的原因有哪些啊,我可以一个一个排查的,弄清楚了问题的原因,基本就能找到解决方法了{:10_279:} 提供一下这个程序的输入,和输出(你期望的输出,正确的输出)
人造人 发表于 2021-9-21 14:31
提供一下这个程序的输入,和输出(你期望的输出,正确的输出)
https://fishc.com.cn/thread-27518-1-1.html
就是小甲鱼的数据结构的一个练习 三刀流.索隆 发表于 2021-9-21 17:04
https://fishc.com.cn/thread-27518-1-1.html
就是小甲鱼的数据结构的一个练习
你直接提供一个输入和输出就可以了
这个程序的输入是什么?这样?
1 2 3 4 #
如果是这个输入,输出是什么? 本帖最后由 三刀流.索隆 于 2021-9-21 17:15 编辑
人造人 发表于 2021-9-21 17:08
你直接提供一个输入和输出就可以了
这个程序的输入是什么?这样?
1 2 3 4 #
输入:++-+-++#,就是输入一串+和-
输出:+ + - + - + +
+ - -- - +
- + + + -
-+ + -
- + -
--
+ 好了,知道输入输出了,我研究研究
输入: ++-+-++
输出:
人造人 发表于 2021-9-21 17:11
好了,知道输入输出了,我研究研究
输入: ++-+-++
输出:
规律就是:+ + | - - | - + | + -
- | + | - | -
符号相同在下面输出+,不同为-, 三刀流.索隆 发表于 2021-9-21 17:18
规律就是:+ + | - - | - + | + -
...
1. 你的代码逻辑不对
2. 申请了内存一定要释放,不释放在一些环境下会报错的
3. 模块化编程,不要在 queue 函数的外面操作 queue 的内部数据结构
/********************/
/***功能:符号三角形**/
/***日期:2021.9.20****/
/*******************/
#include <stdio.h>
#include <stdlib.h>
struct node_tag {
char data;
struct node_tag *next;
};
typedef struct node_tag Qnode;
typedef struct {
Qnode *front, *rear;
size_t size;
} Queue;
void InitQueue(Queue *s);
void InsertQueue(Queue *s, char e);
void DeleteQueue(Queue *s, char *e);
size_t queue_size(Queue *s);
void queue_deinit(Queue *s);
void queue_undelete(Queue *s, char e);
void queue_uninsert(Queue *s, char *e);
int main() {
Queue s;
//Qnode *ptr1, *ptr2;
char c;
//int i = 0, j = 0, mem;
printf("请合法输入-或+,#表示结束输入:");
InitQueue(&s);
scanf("%c", &c);
while (c != '#') //入队操作,#表示结束
{
InsertQueue(&s, c);
//i++;
scanf("%c", &c);
}
/*
// while ()
printf("\n正在生成三角形...");
ptr1 = s.front->next;
ptr2 = s.rear;
while (ptr1 != s.rear) //遍历队列,并生成新节点,直到ptr1指针等于队尾
{
if (ptr1 == ptr2) {
ptr2 = s.rear;
ptr1 = ptr1->next;
}
if (ptr1->data == ptr1->next->data) {
InsertQueue(&s, '+');
} else {
InsertQueue(&s, '-');
}
ptr1 = ptr1->next;
}
printf("\n即将为您打印三角形...\n"); //规律打印队列
for (mem = i; mem >= 0; mem--, i = mem, j++) {
for (; i >= 0; i--) {
DeleteQueue(&s, &c);
printf("%c ", c);
}
printf("\n");
for (; j >= 0;) {
printf(" ");
}
}
*/
size_t width = queue_size(&s);
size_t height = width;
for(size_t y = 0; y < height; ++y) {
size_t i = y;
while(i--) printf(" ");
for(size_t x = 0; x < width - y; ++x) {
char a, b, c = '-';
DeleteQueue(&s, &a);
DeleteQueue(&s, &b);
queue_undelete(&s, b);
if(a == b) c = '+';
InsertQueue(&s, c);
printf("%c ", a);
}
char e;
queue_uninsert(&s, &e);
printf("\n");
}
queue_deinit(&s); // 释放函数一定要写
return 0;
}
void InitQueue(Queue *s) //初始化队列函数
{
s->front = s->rear = (Qnode *)malloc(sizeof(Qnode));
if (s->front == NULL) {
printf("内存分配失败!!!\n");
exit(0);
}
s->rear->next = NULL;
s->size = 0;
}
void InsertQueue(Queue *s, char e) //入队函数
{
// if (s->rear - s->front == maxSize)
// s->front = (Qnode*)realloc(s->rear,maxSize * sizeof(Qnode));
s->rear->next = (Qnode *)malloc(sizeof(Qnode));
if (s->rear->next == NULL) {
printf("错误!");
exit(0);
}
s->rear = s->rear->next;
s->rear->data = e;
s->rear->next = NULL;
++s->size;
}
void DeleteQueue(Queue *s, char *e) //出队函数
{
/*
Qnode *temp = s->front;
s->front = s->front->next;
*e = (s->front->data);
free(temp);
*/
if(queue_size(s) == 0) return;
Qnode *temp = s->front->next;
s->front->next = s->front->next->next;
*e = temp->data;
free(temp);
if(--s->size == 0) {
s->rear = s->front;
}
}
size_t queue_size(Queue *s) {
return s->size;
}
void queue_deinit(Queue *s) {
char e;
while(queue_size(s) != 0) DeleteQueue(s, &e);
free(s->front);
}
void queue_undelete(Queue *s, char e) {
Qnode *temp = malloc(sizeof(*temp));
temp->data = e;
temp->next = s->front->next;
s->front->next = temp;
if(s->size++ == 0) {
s->rear = temp;
}
}
void queue_uninsert(Queue *s, char *e) {
if(queue_size(s) == 0) return;
Qnode *prev = s->front;
while(prev->next != s->rear) prev = prev->next;
s->rear = prev;
free(s->rear->next);
s->rear->next = NULL;
--s->size;
}
人造人 发表于 2021-9-21 20:53
1. 你的代码逻辑不对
2. 申请了内存一定要释放,不释放在一些环境下会报错的
3. 模块化编程,不要在 qu ...
牛逼啊,果然是神仙,嗯~ o(* ̄▽ ̄*)o,我还想问一下,你用的是什么编译器啊,太舒服了吧~ 三刀流.索隆 发表于 2021-9-21 22:45
牛逼啊,果然是神仙,嗯~ o(* ̄▽ ̄*)o,我还想问一下,你用的是什么编译器啊,太舒服了吧~
vim 人造人 发表于 2021-9-21 22:48
vim
咦,怎么弄的呀?{:9_222:} 三刀流.索隆 发表于 2021-9-21 22:55
咦,怎么弄的呀?
安装 YCM
https://www.jianshu.com/p/7c8d0510f1d6
https://www.cnblogs.com/kimalittlestar/p/11557835.html #include <stdio.h>
int count = 1;
int notDanger(int row,int j,int (*chess))
{
int i,k,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0;
//列
for (i = 0;i < 8;i++)
{
if (*(*(chess+i)+j) != 0)
{
flag1 = 1;
break;
}
}
//左上方
for(i = row,k = j;i >= 0 && k >= 0;i--,k--)
{
if (*(*(chess+i)+k) != 0)
{
flag2 = 1;
break;
}
}
// 右下方
for(i = row,k = j;i < 8 && k < 8;i++,k++)
{
if (*(*(chess+i)+k) != 0)
{
flag3 = 1;
break;
}
}
//
for(i = row,k = j;i >= 0 && k < 8;i--,k++)
{
if (*(*(chess+i)+k) != 0)
{
flag4 = 1;
break;
}
}
for(i = row,k = j;i < 8 && k >= 0;i++,k--)
{
if (*(*(chess+i)+k) != 0)
{
flag5 = 1;
break;
}
}
if (flag1||flag3||flag2||flag4||flag5)
return 0;
else
return 1;
}
//row:起始行,
//n:列数
//(*chess):指向每一行的指针
void EightQueen(int row,int n,int (*chess))
{
int chess2,i,j;
for (i = 0;i < 8;i++)
{
for (j = 0;j < 8;j++)
{
chess2 = chess;
}
}
if (8 == row)
{
printf("第%d种:\n",count);
for(i = 0;i < 8;i++)
{
for (j = 0;j < 8; j++)
{
printf("%d ",*(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
count++;
}
else
{
for (j = 0; j < n;j++)
{
if (notDanger(row,j,chess2))
{
for(i = 0;i < 8;i++)
{
*(*(chess2+row)+i) = 0;
}
*(*(chess2+row)+j) = 1;
EightQueen(row+1,n,chess2);
}
}
}
}
int main()
{
int chess,i,j;
for (i = 0;i < 8;j++)
{
for (j = 0;j < 8;j++)
{
chess = 0;
}
}
EightQueen(0,8,chess);
printf("总共有%d种解决方法!\n\n",count);
return 0;
}
页:
[1]