【问题标题】:Inserting a name and number to the end of linked list将名称和数字插入到链表的末尾
【发布时间】:2015-02-08 22:49:34
【问题描述】:

我的文本文件是这样的:

George Washington, 2345678 
John Adams, 3456789 
Thomas Jefferson, 4567890 
James Madison, 0987654 
James Monroe, 9876543 
John Quincy Adams, 8765432 
Andrew Jackson, 7654321 
Martin Van Buren, 6543210

有人可以提供有关我如何使用插入函数将名称和 ID 号添加到链接列表末尾的见解吗?当我运行代码时,选择选项 1 它会跳过添加名称,只要求输入整数。之后什么都没有发生。

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

//Creates node for holding student's information
struct node
{
    char name [50];
    int id;
    struct node *next;
}*head;

//Create Function Prototypes
void readDataFile ();
void insert(char *inName, char *inID);
void display(struct node *d);
int deleteID(int num);
void deleteName(char dname);


//Main function
int main()
{
    //Declare variables
    int i, num, id;
    char *name;
    char nameDelete [50];
    char nameInsert [50];
    struct node *n;

    //initialize link list
    head = NULL;

    //Read in file
    readDataFile();

    //Create list of operations utilized in program
    while (1)
    {
        printf("\nList Operations\n");
        printf("===============\n");
        printf("1.Insert\n");
        printf("2.Display\n");
        printf("3.Delete by ID\n");
        printf("4.Delete by Name\n");
        printf("5.Exit\n");
        printf("Enter your choice : ");

        if(scanf("%d", &i) <= 0)
        {
            printf("Enter only an Integer\n");
            exit(0);
        }
        else
        {
            switch(i)
            {
                case 1:
                    printf("Enter the name to insert:\n");
                    scanf("%[^\n]s", nameInsert);
                    getchar();
                    printf("Enter the ID associated with the name: ");
                    scanf("%d", &id);
                    insert(nameInsert, id);
                    break;
                case 2:
                    if (head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Elements in the list are:\n");
                    }
                    display(n);
                    break;
                case 3:
                    if(head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Enter the ID number to delete: ");
                        scanf("%d", &id);
                    }

                    if(deleteID(id))
                        printf("%d deleted successfully \n", id);
                    else
                        printf("%d not found in the list\n", id);
                    break;
                case 4:
                    if(head == NULL)
                        printf("List is Empty\n");
                    else
                    {
                        printf("Enter name to delete: ");
                        gets(nameDelete);
                    }
                case 5:
                    return 0;
                default:
                    printf("Invalid option\n");
            }
        }
    }
    return 0;
}

//Define the functions
//Function to read in the data file
void readDataFile()
{
    //Initialize the link the list
    struct node *temp;
    temp = malloc(sizeof(struct node));
    temp->next = NULL;
    head = temp;

    //Open up the file
    FILE *fp;
    fp = fopen("AssignmentOneInput.txt", "r");

    //Use memset function to copy the characters in string
    char string[100];
    memset(string, 0, 100);

    //Create while loop scan in the contents of the file
    while(fgets(string, 100, fp) != NULL)
        {
        sscanf(string, "%20[^,], %d", temp->name, &temp->id);
        temp->next = malloc(sizeof(struct node));
        temp = temp->next;
        temp->next = NULL;

        }
        fclose(fp);
}

//Function to insert a name and ID number
void insert(char *inName, char *inID)
{
    //Create temporary and helper nodes
    struct node *temp, *helper;

    //Allocate the memory for the temporary node
    temp = (struct node *)malloc(sizeof(struct node));

    //Convert character into integer value
    int intID = atoi(inID);

    //Set the data in the node
    strcpy(temp->name, inName);
    temp->id = intID;
    temp->next = NULL;

    //Create new node and add to it
    helper = (struct node *)head;

    while(helper->next != NULL)
    {
        helper = helper->next;
    }

    helper->next = temp;
    helper = temp;
    helper->next = NULL;
}

【问题讨论】:

  • insert() 有什么问题?
  • 它甚至可以编译吗? insert 期望第二个参数是 char*,但你在那里传递了 int...
  • @Inspired 这就是我想要弄清楚的。当它运行和编译时,它会跳过添加名称部分并要求与名称关联的 int
  • 得到答案后不要破坏你的问题。
  • 使用调试器。另外,你认识瓦妮莎吗? stackoverflow.com/questions/28401475/…

标签: c file function insert linked-list


【解决方案1】:

在选择选项中输入 1 后,标准输入将同时包含 1 和换行符,您会在下一个 scanf 语句中立即看到这些字符。

scanf("%[^\n]s", nameInsert); 更改为scanf("%s", nameInsert); 或在获得选择选项后立即使用getchar()

【讨论】:

  • 因为目标是输入像“George Washington”这样的名字(名字中有空格),扫描集是个好主意,但格式字符串前面应该有一个空格(但 not 在它之后)吃掉任何前导空格,例如前一个条目留下的换行符。因此:if (scanf(" %49[^\n]", nameInsert) != 1) { …handle EOF… }。扫描集本身就是一个转换说明符。后面的s 是一个常见的错误。在这种情况下,它几乎是无害的(它无法匹配换行符,但scanf() 无法报告该失败),但在其他情况下可能会破坏您的 I/O。
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2011-08-13
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多