显示功能未打印链接列表

时间:2016-08-22 03:05:40

标签: c data-structures linked-list

我正在尝试制作一个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();
}

直到现在我还没有编写加入两个链接列表的代码,因为首先我想摆脱这个问题

请帮助!!!!

3 个答案:

答案 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(例如strtolstrtoul,...)函数(请参阅 man strtol 并注意**endptr参数)。 fgets /(然后解析)方法中的关键是 解耦 您对数据解析的输入读取允许您同时(1)验证您的阅读,然后还(2)验证您的数据,而不是尝试在一次scanf调用中完成所有操作。有scanf的用途,但是使用交替的混合字符数字用户输入并不是推荐用户之一。