2015-02-08 68 views
0

我的文本文件读取这样的:插入姓名和电话号码,以链接列表的末尾

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,

有人能提供我如何得到我的插入功能的姓名和身份证号码添加到年底的洞察力链表?当我运行代码时,选择选项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; 
} 
+0

'insert()'有什么问题? – Inspired 2015-02-08 22:54:39

+1

它甚至编译? 'insert'期望第二个参数是'char *',但是你在那里传递'int' ... – Inspired 2015-02-08 22:59:28

+0

@Inspired这就是我想要弄明白的。当它运行并编译时,它会跳过添加名称部分,并要求与名称关联的int – Beginner 2015-02-08 23:05:33

回答

0

一旦你选择选项中输入1标准输入既有1和换行符,你在接下来的scanf声明立即期待。

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

+0

既然目标是让名字像'乔治华盛顿'进入(名称中有一个空格), scan-set是一个好主意,但格式化字符串应该在它之前有一个空格(但不要在它之后),以便吃掉任何前导空格,例如前一个条目留下的换行符。因此:'if(scanf(“%49 [^ \ n]”,nameInsert)!= 1){...处理EOF ...}'。扫描集本身就是一个转换说明符。这是一个常见的错误之后的's'。在这种情况下,它几乎是无害的(它不能匹配换行符,但'scanf()'没有办法报告这个失败),但在其他情况下可能会破坏你的I/O。 – 2015-02-09 15:34:42