我正在尝试制作一个c程序来加入两个链接列表 但与此同时,当我在每次插入后打印链接列表的数据时,列表不打印 我特此附上代码
// Creating a menu deriv en program of single link list
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
void main()
{
struct node *a;
char ch;
struct node *temp;
struct node *temp1;
a=NULL;
clrscr();
do
{
if(a==NULL)
{
temp=(struct node*)malloc(sizeof(struct node));
printf("\nEnter Data\n");
scanf("%d",&temp->data);
temp->next=NULL;
a=temp;
}
else
{
temp=(struct node*)malloc(sizeof(struct node));
temp->next=NULL;
printf("\nEnter data element\n");
scanf("%d",&temp->data);
temp1=a;
while(temp1->next!=NULL)
{
temp1=temp1->next;
}
temp1->next=temp;
}
printf("\nDo You Wish to continue\n");
ch=getch();
}while(ch=='Y'||ch=='y');
printf("Do You Wish To See More Link List Operations");
ch=getch();
if(ch=='Y'||ch=='y')
{
printf("Press 1 For inserting node at the beginning of the list");
ch=getch();
switch(ch)
case 1:
temp=(struct node*)malloc(sizeof(struct node));
printf("Enter first data element");
scanf("%d",&temp->data);
temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;
temp1=temp1->next;
a=temp;
temp=temp1;
}
printf("\nStatus of the link list\n");
temp1=a;
while(temp1!=NULL)
{
printf(" %d ",temp1->data);
temp1=temp1->next;
}
getch();
}
直到现在我还没有编写加入两个链接列表的代码,因为首先我想摆脱这个问题
请帮助!!!!
答案 0 :(得分:1)
我看到的错误:
switch
声明未被正确屏蔽
你有:
switch(ch)
case 1:
temp=(struct node*)malloc(sizeof(struct node));
printf("Enter first data element");
scanf("%d",&temp->data);
temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;
temp1=temp1->next;
a=temp;
temp=temp1;
这相当于:
switch(ch)
{
case 1:
temp=(struct node*)malloc(sizeof(struct node));
}
printf("Enter first data element");
scanf("%d",&temp->data);
temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;
temp1=temp1->next;
a=temp;
temp=temp1;
我怀疑你打算使用:
switch(ch)
{
case 1:
temp=(struct node*)malloc(sizeof(struct node));
printf("Enter first data element");
scanf("%d",&temp->data);
temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;
temp1=temp1->next;
a=temp;
temp=temp1;
}
case
由于您正在1
中阅读char
,因此您需要使用:
case '1': // That is the character literal '1', not the integer literal 1
答案 1 :(得分:0)
如果您正在行使switch-case
代码。
案例陈述中的操作不正确。
....
case 1:
temp=(struct node*)malloc(sizeof(struct node));
printf("Enter first data element");
scanf("%d",&temp->data);
temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;
temp1=temp1->next;
a=temp;
temp=temp1;
...
只需在列表的开头添加一个新节点即可。
可以这样做case 1:
temp=(struct node*)malloc(sizeof(struct node));
printf("Enter first data element");
scanf("%d",&temp->data);
/*temp1=(struct node*)malloc(sizeof(struct node));
temp1=a;*/
temp->next = a;
a=temp;
答案 2 :(得分:0)
你绝对会把你的头发与scanf
混合数字和字符输入。 getch
是一个非便携式绑带,它将键盘置于原始无缓冲模式,有助于掩盖问题,因此如果您只是学习如何正确处理用户输入,那么您将自己做一件大事。从一开始。
scanf
采用混合输入的主要缺点是它将'\n'
留在输入缓冲区中。如果您只扫描数字输入,没问题,因为数字转换会跳过前导空白(包括'\n'
)。但是,当您第一次要求字符(例如'y'
或'Y'
)BAM时,scanf
会愉快地在输入中等待'\n'
缓冲区为您的输入。此外,您无法判断代码中是否已正确读取数字或字符,因为您从未查看scanf
的返回。
而不是尝试管道胶带和bail-wire 将scanf
输入例程一起转换为工作表单,只需用户输入即可。使用fgets
读取每个输入(读取'\n'
并解决问题)并使用sscanf
解析输入。 [1] ,例如
if (a == NULL) {
temp = malloc (sizeof *temp);
temp->next = NULL;
printf (" Enter Data: ");
/* do NOT mix character and numeric input with scanf UNLESS
* you know EXACTLY what your are doing.
*/
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
if (sscanf (buf, "%d", &temp->data) != 1) {
fprintf (stderr, "error: invalid conversion.\n");
return 1;
}
a = temp;
} ...
在您的输入被理顺之后,您可以通过在列表的开头添加值来专注于您的逻辑错误。正如我在评论中指出的那样,所需要的只是创建新节点,并将->next
指针设置为现有列表,然后将list-address设置为新节点的地址,例如:< / p>
temp->next = a;
a = temp;
将所有这些部分放在一起,并记住要跟踪并free
已分配的内存,您可以使用以下代码执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#define MAXC 64 /* constant (macro define) to use for buffer length */
struct node {
int data;
struct node *next;
};
int main (void) /* main is type 'int' and returns a value */
{
char buf[MAXC] = ""; /* if taking numeric & char input use fgets */
struct node *a = NULL, *temp, *temp1;
// clrscr (); /* clrscr is non portable, only win has conio.h */
do {
if (a == NULL) {
temp = malloc (sizeof *temp);
temp->next = NULL;
printf (" Enter Data: ");
/* do NOT mix character and numeric input with scanf UNLESS
* you know EXACTLY what your are doing.
*/
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
if (sscanf (buf, "%d", &temp->data) != 1) {
fprintf (stderr, "error: invalid conversion.\n");
return 1;
}
a = temp;
} else {
temp = malloc (sizeof *temp);
temp->next = NULL;
printf (" Enter data element: ");
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
if (sscanf (buf, "%d", &temp->data) != 1) {
fprintf (stderr, "error: invalid conversion.\n");
return 1;
}
temp1 = a;
while (temp1->next != NULL) {
temp1 = temp1->next;
}
temp1->next = temp;
}
printf (" Do You Wish to continue (y/n)?: ");
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid entry.\n");
return 1;
}
// ch = getch (); /* getch is non-portable */
} while (*buf == 'y' || *buf == 'Y');
printf (" Do You Wish To See More Link List Operations (y/n)? ");
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid entry.\n");
return 1;
}
if (*buf == 'y' || *buf != 'Y') {
printf (" Press 1 For inserting node at the beginning of the list: ");
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid entry.\n");
return 1;
}
switch (*buf) {
case '1' : temp = malloc (sizeof *temp);
printf (" Enter first data element: ");
if (!fgets (buf, MAXC, stdin)) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
if (sscanf (buf, "%d", &temp->data) != 1) {
fprintf (stderr, "error: invalid conversion.\n");
return 1;
}
temp->next = a;
a = temp;
break;
default : fprintf (stderr, "error: invalid selection.\n");
}
}
printf ("\nStatus of the link list\n");
temp1 = a;
while (temp1 != NULL) {
printf (" %d ", temp1->data);
temp1 = temp1->next;
}
putchar ('\n');
// getch (); /* use getchar, getch is non-portable */
temp = a;
while (temp) { /* free the memory you have allocated */
struct node *victim = temp;
temp = temp->next;
free (victim);
}
return 0;
}
示例使用/输出
$ ./bin/lldisplay
Enter Data: 2
Do You Wish to continue (y/n)?: y
Enter data element: 3
Do You Wish to continue (y/n)?: y
Enter data element: 4
Do You Wish to continue (y/n)?: y
Enter data element: 5
Do You Wish to continue (y/n)?: n
Do You Wish To See More Link List Operations (y/n)? y
Press 1 For inserting node at the beginning of the list: 1
Enter first data element: 1
Status of the link list
1 2 3 4 5
仔细检查并确保理解,如果您有任何问题,请告诉我。
<强> 脚注: 强>
1。 在解析用户输入的文本行时,您不仅限于sscanf
,您只需走一条指针(或指针对)在字符串下面手动测试/解析您需要的任何值组合。您还可以使用指针并在解析数字输入的同时遍历strtoX
(例如strtol
,strtoul
,...)函数(请参阅 man strtol 并注意**endptr
参数)。 fgets
/(然后解析)方法中的关键是 解耦 您对数据解析的输入读取允许您同时(1)验证您的阅读,然后还(2)验证您的数据,而不是尝试在一次scanf
调用中完成所有操作。有scanf
的用途,但是使用交替的混合字符和数字用户输入并不是推荐用户之一。