数据结构—链队列的基本操作(字符类型数据入队的问题)
注:本文主要讲述字符型数据 入队遇到的问题以及解决方案,若想详细了解基本操作功能及讲解请移步其他文章。<功能源码可全部复制>
我在入队操作时候,通过循环输入三个字符,发现第三位字符无法进队,需要增加一次循环才可以全部入队,而且入队之后打印输出元素,发现前面多了一项换行的字符
产生原因:由于在输入元素个数时候,需要按回车键进行下一步,此时就默认在输入数据1 a 2前方默认有个换行符,所以在进行入队操作时,实际入队为:‘\n’ ‘1’ ‘a’三个元素。
解决方案:
- 在循环输入语句增加一次循环让剩下一个元素进队
- 在入队操作时,判断换行符,如果是换行符return跳出(这样换行符就不会进队了)
- 判断换行符条件: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()方法获取可以直接省略换行符,感兴趣的小伙伴可以多多尝试~~~~~