【问题标题】:Basic Linked List operations in CC中的基本链表操作
【发布时间】:2015-07-14 09:20:55
【问题描述】:

我正在创建一个程序来执行基本的链表操作。现在我已经编写了仅用于在前面插入节点的代码。我运行我的程序来查看它是否工作,但程序在接受节点的输入后终止,然后在切换后打印消息。它甚至不会因为接受我的输入而暂停(就在 main() 结束之前)

这里是代码:

#include <stdio.h>
#include <stdlib.h>

struct linkedlist
{
    int num;
    struct linkedlist *next;
};
struct linkedlist *head = NULL;

void display();

void insertBeginning()
{

    struct linkedlist *obj;
    int no;

    obj = (struct linkedlist *)malloc(sizeof(struct linkedlist));

    if(obj == NULL)
    {
        printf("\n Overflow ");
    }
    else
    {
        printf("\n Enter the number = ");
        scanf("%d", &no);

        obj->num = no;

        if(head == NULL)
        {
            head = obj;
            obj->next = NULL;

        }
        else
        {
            obj->next = head;
            head = obj;
        }   

    }
}

void display ()
{
    struct linkedlist *head2 = head;
    while(head2 != NULL)
    {
        printf("%d ->",head2->num);
        head2=head->next;
    }
    printf("NULL \n");
}

int main()
{

    int choice;
    char wish;


    printf("\n 1. Insert at beginning");
    printf("\n 2. Insert at end");
    printf("\n 3. Insert in between");
    printf("\n 4. Delete from front");
    printf("\n 5. Delete from end");
    printf("\n 6. Delete from in between");
    printf("\n 7. Reverse");
    printf("\n 8. Sort ascending");
    printf("\n 9. Sort descending");
    printf("\n 10.Swap alternate elements");
    printf("\n 11.Display\n\n");



   do
   {
        printf("\n Enter the option = ");
        scanf("%d", &choice);

        switch(choice)
        {
            case 1:
                insertBeginning();
                break;

            case 2:
//              insertEnd();
                break;

            case 3:
//              insertInbetween();
                break;

            case 4:
//              deleteFront();
                break;

            case 5:
//              deleteEnd();
                break;

            case 6:
//              deleteInbetween();
                break;

            case 7:
//              Reverse();
                break;

            case 8:
//              sortAsc();
                break;

            case 9:
//              sortDesc();
                break;

            case 10:
//              swap();
                break;

            case 11:
                display();
                break;

            default:
                printf("\n Wrong choice ");

        }

        printf("\n Do you wish to continue (y/n) = ");
        scanf ("%c",&wish);

   }while(wish == 'y' || wish =='Y');   

return 0;
}

【问题讨论】:

  • 或者您可以在菜单中添加“0. Quit”并跳过“continue (y/n)”
  • 在 C 中调用 malloc() 时,不要强制转换返回值。它已经是一个 void* 所以可以分配给任何指针。调用scanf()时,始终检查返回值(不是参数)以确保操作成功

标签: c data-structures malloc singly-linked-list


【解决方案1】:

在你的情况下,你必须改变

 scanf ("%c",&wish);

scanf (" %c",&wish);

因为,如果您在格式说明符之前不包含前导空格,它将考虑通过按 ENTER生成并存储到输入缓冲区中的剩余 \n(换行符) > 第一次输入后的键。所以,第二个scanf() 不会等待用户输入。

【讨论】:

  • 谢谢。它现在工作。我浪费了很多时间使用 gdb 来找出问题所在。起初我以为我的插入逻辑有问题
【解决方案2】:

调用scanf()时

1) 使用 '%d' 格式说明符,用户输入数字的尾随换行符将不会被使用。

2) 使用 '%c' 格式说明符,前导空格,如换行符,将导致 scanf() 失败,而参数 (wish) 保持不变。

3) 在发布的代码中,当“wish”不包含有效的“Y”或“y”时,程序退出。

我同意另一位发帖者的观点,即添加一个选项“0”退出会比单独调用 scanf() 更好的方法

【讨论】:

    【解决方案3】:

    在输入 'choice' 后有一个新行,它由变量 'wish' 扫描。所以我们需要删除那个换行符('\n')。

    因此,如果您希望用户继续,只需在输入希望之前使用 getchar()。它简单易行。

    printf("\n Do you wish to continue (y/n) = ");
    getchar();
    scanf ("%c",&wish);
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2023-02-09
      • 2017-02-18
      • 2020-11-21
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多