|
发表于 2021-9-21 20:53:58
|
显示全部楼层
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;
- }
复制代码 |
|