数据结构——链队列的基本操作(字符类型数据入队的问题)

数据结构—链队列的基本操作(字符类型数据入队的问题)

注:本文主要讲述字符型数据 入队遇到的问题以及解决方案,若想详细了解基本操作功能及讲解请移步其他文章。<功能源码可全部复制>

  我在入队操作时候,通过循环输入三个字符,发现第三位字符无法进队,需要增加一次循环才可以全部入队,而且入队之后打印输出元素,发现前面多了一项换行的字符
在这里插入图片描述

  产生原因:由于在输入元素个数时候,需要按回车键进行下一步,此时就默认在输入数据1 a 2前方默认有个换行符,所以在进行入队操作时,实际入队为:‘\n’ ‘1’ ‘a’三个元素。

解决方案:

  1. 在循环输入语句增加一次循环让剩下一个元素进队
  2. 在入队操作时,判断换行符,如果是换行符return跳出(这样换行符就不会进队了)
  3. 判断换行符条件:if (e==’\n’) return 0;
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define  TRUE 1
#define  FALSE 0
#define MAXSIZE 50

typedef char QueueElementType;
typedef struct Node
{
	QueueElementType data;  //数据域QueueElementType
	struct Node * next;     //指针域
}LinkQueueNode;

typedef struct
{
	LinkQueueNode *front;
	LinkQueueNode *rear;
}LinkQueue;

int InitQueue(LinkQueue *Q) //初始化
{
	Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(Q->front!=NULL)
	{
		Q->rear=Q->front;
		Q->front->next=NULL;
		return printf("初始化成功!\n"); //(TRUE)
	}
	else return (FALSE);  //溢出
}


int EnterQueue(LinkQueue *Q,QueueElementType e)  
{
	LinkQueueNode * NewNode;
	 if (e=='\n')
		return 0;
	NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(NewNode!=NULL)
	{
		NewNode->data=e;
		NewNode->next=NULL;
		Q->rear->next=NewNode;
		Q->rear=NewNode;
		return (TRUE);
	}
	else return (FALSE);
}

int DeleteQueue(LinkQueue *Q,QueueElementType x)
{
	LinkQueueNode * p;
	if(Q->front==Q->rear)
		return (FALSE);
	p=Q->front->next;
	Q->front->next=p->next;  //队头元素出队
	if(Q->rear==p)			 //若队中只有一个元素P,则P出队后成空队
		Q->rear=Q->front;    
	//*x=p->data;
	free(p);
	return printf("出队成功!\n");

}

int IsEmpty(LinkQueue * q)
{
  return (q->front== q->rear)?1:0;
}


void print(LinkQueue * q)
{
  LinkQueueNode * p = q->front->next;
  if(IsEmpty(q))
  {
	printf("队列为空!");
  }else
  {
	printf("现在队列的元素为:");
	while (p) {
		printf("%c ", p->data);
		p = p->next;
	  }
  }
  printf("\n");
}


void main()
{
	LinkQueue q;
	//LinkQueueNode  p = q.front.next;
	char e;
	int choose,cycle=1,i=0,x;
	system("color 2f");
	InitQueue(&q);
	while(cycle){
		printf("请输入要执行的操作:\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t1.    入队   \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t2.    出队    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t3.    输出    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t4.    退出    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		//choose =getch();
		scanf("%d",&choose);
		switch (choose)
		{
		case 1://入队
				printf("请输入入队元素个数:");
				scanf("%d",&x);
				printf("请输入入队元素<请用,号隔开>:");
				for(i=0;i<=x;i++)
					{
						scanf("%c,",&e);
						EnterQueue(&q,e);
					}
				print(&q);
				system("pause");
			break;
		case 2://出队
				DeleteQueue(&q,x);
				print(&q);
				system("pause");
				break;
		case 3://输出队列元素
			print(&q);
			system("pause");
			break;
		case 4:
			cycle=0;
			printf("RZH欢迎您再次使用:\n");
			break;
		default	:
			printf("输入有误,欢迎您再次使用:\n");
			cycle=0;

		}
	}
}

修改后代码效果图
在这里插入图片描述
注:在循环输入语句scanf(" %c,",&e); %c前面加个空格的格式好像也可以解决,使用gets()方法获取可以直接省略换行符,感兴趣的小伙伴可以多多尝试~~~~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值