首页 新闻 搜索 专区 学院

初学单链表。为什么我的cin输入语句只能执行一次?请大佬帮我看看case2中的while语句有什么问题吗?非常感谢!!!

0
悬赏园豆:30 [已解决问题] 解决于 2021-12-15 15:21

include <iostream>

include "stdio.h"

include "stdlib.h"

using namespace std;

define OK 1

define ERROR 0

//#define OVERFLOW -2

typedef int Status;
typedef char ElemType;

//线性表的链式存储结构定义
typedef struct LNode
{
ElemType data;
struct LNode* next;
} LNode, * LinkList;

//初始化
Status InitList(LinkList& L)
{
L = new LNode;
L->next = NULL;
return OK;
}
//尾插法创建单链表
void CreateList_R(LinkList& L, int n)
{
LinkList r, p;
L = new LNode;
L->data = NULL;
//调试发现当把初始化的头结点的数值也置为NULL后,第一个输入的元素才不是汉字
L->next = NULL;//将头结点的指针域置空
r = L;
for (int i = 0; i < n;i++)
{
p = new LNode;
cin >> p -> data;
p->next = NULL; r->next = p;
r = p;
}
}
void printfList(LinkList& L)
{//输出单链表
LinkList q;
q = L;
while (q)
{
printf("%c", q->data);
q = q->next;
}
printf("\n");
}
//插入
Status ListInsert(LinkList& L, int i, ElemType e)
{
LinkList p, s;
p = L;
int j = 0;
while (p && (j < i - 1))
{
p = p->next;
++j;
}
if (!p || j > i - 1)return ERROR;

s = new LNode;
s->data = e;
s->next = p->next;

}
//删除
Status ListDelete(LinkList& L, int i)
{
LinkList p,q;
p = L;
int j = 0;
while((p->next)&&(j<i-1))
{
p = p->next; ++j;
}
if (!(p->next) || (j > i - 1)) return ERROR;
q = p->next;//临时保存被删除的结点的地址,以便释放
p->next = q->next;//改变删除结点前驱结点的指针域
delete q;//释放删除结点的空间
return OK;
}
//按值查找
LNode* LocateElem(LinkList L, ElemType e)
{//查找值为e的元素
LinkList p;
p = L->next;//初始化,p指向首元结点
while (p && p->data != e)
p = p->next;
return p;//查找成功,返回值为e的结点地址
}
// 按位查找
LNode* LocateSort(LinkList L, int i)
{//查找序为i的元素
LinkList p;
int j;
p = L->next;//初始化,p指向首元结点
j= 0;
while (p->next && j < i)
{
p = p->next;
j++;
}
if(i= =j)
return p;
else return NULL;
}
//遍历
void ListTraverse(LinkList L)
{
if (L == NULL)
{
printf("NULL\n");
return;
}
LinkList p = L->next;
while (p != NULL)
{
putchar(p->data);
p = p->next;
}
}
//通过switch来实现LinklistL;
int main()
{
LinkList L{};
printf("--------1.初始化一个链表(头结点)--------\n");
printf("--------2.创建n个节点的单链表--------\n");
printf("--------3.第i个结点前插入x--------\n");
printf("--------4.删除第i个结点--------\n");
printf("--------5.查找指定元素e是否存在--------\n");
printf("--------6.查找第i个结点--------\n");
printf("--------7.输出所有元素--------\n");
int choose;
do
{
printf("请输入choose的值");
cin >> choose;
switch (choose)
{
case 1:
printf("开始初始化单链表L");
InitList(L);
break;
case 2:
printf("创建n个节点的单链表\n");
printf("请输入元素个数\n");
int n;
cin >> n;
printf("请输入各元素\n");
while(choose==2)
{
CreateList_R(L, n);
printfList(L);
break;
}
break;
case 3:
printf("第i个结点前插入x\n");
char x;
int i;
printf("请输入第几个结点:\n");
cin >> i;
printf("请输入要插入的数:\n");
cin >> x;
ListInsert(L, i, x);
printf("输出各元素为");
printfList(L);
break;
case 4:
printf("删除第i个结点\n");
//int i;
printf("请输入删除哪个结点:\n");
cin >> i;
ListDelete(L, i);
printf("输出各元素为");
printfList(L);
break;
case 5:
printf("查找指定元素e是否存在\n");
char e;
printf("请输入你要查找的元素:\n");
cin >> e;
LocateElem(L, e);
break;
case 6:
printf("查找第i个结点\n");
//int i;
printf("请输入i的值:\n");
cin >> i;
LocateSort(L, i);
break;
case 7:
printf("输出所有元素\n");
ListTraverse(L);
break;
default:
printf("输入的选择是不正确的!");
}
} while (choose != -1);
}

好好学语言的主页 好好学语言 | 初学一级 | 园豆:172
提问于:2021-12-15 12:04
< >
分享
最佳答案
0
		case 2:
			printf("创建n个节点的单链表\n");
			printf("请输入元素个数\n");
			int n;
			cin >> n;
			printf("请输入各元素\n");
			while (choose == 2)
			{
				CreateList_R(L, n);
				printfList(L);
				break;
			}
			break;

你这个while语句里面执了CreateList_R(L, n); printfList(L);这两句之后就直接跳出循环了 ,当然只能执行1次。如果想让它符合条件才跳出,需要在用个if条件语句进行判断,符合条件才跳出,或者不符合条件才跳出。

		case 2:
			printf("创建n个节点的单链表\n");
			printf("请输入元素个数\n");
			int n;
			cin >> n;
			printf("请输入各元素\n");
			while (choose == 2)
			{
				CreateList_R(L, n);
				printfList(L);
                               if(条件){
				       break;
                                }
			}
			break;
收获园豆:30
中华鲟3670 | 小虾三级 |园豆:647 | 2021-12-15 12:28

是最上面的cin>>choose那一条语句。
应该是我case2中的while循环出现问题了,当我case2执行结束重新显示“请重新输入choose的值”这时不能继续输入choose=3使程序进行case3的代码,而是直接跳转到了default 这是为什么?

好好学语言 | 园豆:172 (初学一级) | 2021-12-15 12:54

@好好学语言:
没有啊,我执行你的程序,执行case2 之后,可以继续输入choose=3啊,只是你的插入程序写的有问题,执行插入之后,输出的还是原来的数据

中华鲟3670 | 园豆:647 (小虾三级) | 2021-12-15 13:25

@中华鲟3670: 我刚刚试了一下的确成功了,可再试居然又出现下面的情况了!是我的vs出问题了吗······

好好学语言 | 园豆:172 (初学一级) | 2021-12-15 14:04

@中华鲟3670: 我又试了一下,发现是当我输入的元素超过我输入的元素个数时会这样,请问有什么好的改进方法吗?比如当我输入元素个数大于规定个数是,后面的就会被舍弃了

好好学语言 | 园豆:172 (初学一级) | 2021-12-15 14:19

@好好学语言:

我输入的是数字,不会报错的,因为ElemType的默认是int型。但会把输入的多出来的数字当作后面输入的choose 值。如果不是choose范围内的值就会出现你前面说的会到defult 里面去。
这个问题你可以对输入值进行判断处理,如果超过规定的数量则舍去多余的部分,这个对你来说应该不难

中华鲟3670 | 园豆:647 (小虾三级) | 2021-12-15 14:51

@中华鲟3670: 好的!我懂了,非常感谢!!!

好好学语言 | 园豆:172 (初学一级) | 2021-12-15 15:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册