将文本文件读取到双向链表

时间:2013-03-13 19:36:25

标签: c struct io doubly-linked-list

我正在使用双向链接列表对联系人管理器进行编码,该列表由函数使用读取contactList.txt的指针进行操作。

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<stdlib.h>
#include<dos.h>

//functions
listelement * getFirst(listelement *listpointer,string query[MAX]);
void getLast();
void getEmail();
void getCompany();
void getNumber();
void editCon();
void delCon();
void addCon();
void listAll();
void sortCon();
void Menu (int *choice);

#define MAX 20
//struct to order contactList
struct contact
{
    string firstName[MAX],lastName[MAX],email[MAX],companyName[MAX];
    long phoneNum[MAX];
    struct listelement *link
    struct contact *next;
    struct contact *prev;

}list;



int main()
{
    listelement listmember, *listpointer;
    string query;int iChoice = 0;
    listpointer = NULL;


    Menu (&iChoice);
    int iChoice;

    fflush(stdin);
    scanf_s("%d", &iChoice);
    // user enters one of 9 values
    // options are as follows: get first name,last name,list all contacts,search through contacts,add a new contact,edit/delete or sort contacts.
    switch(iChoice)
    {
        case 1:     
        {
            printf ("Enter contact first name to get details  ");
            scanf ("%d", &query);
            listpointer = getFirst (listpointer, query);
            break;
        }
        case 2:     
        {
            getLast();
            break;
        }
        case 3:     
        {
            listAll();
            break;
        }
        case 4:     
        {
            getEmail();
            break;
        }
        case 5:     
        {
            getCompany();
            break;
        }
        case 6:     
        {
            getNumber();
            break;
        }
        case 7:     
        {
            addCon();
            break;
        }
        case 8:     
        {
            editCon();
            break;
        }
        case 9:     
        {
            delCon();
            break;
        }
        case 10:        
        {
            sortCon();
            break;
        }
        case 11:        // exit
        {
            printf("\n\nProgram exiting!...");
            exit(0);//terminates program
            break;
        }
        default:
        printf ("Invalid menu choice - try again\n");
        break;

    }//end of switch
    return(iChoice);


}//end of main
//menu function to test if invalid input was entered in a menu choice.
void Menu (int *iChoice)
{
    char    local;

    system("cls");
    printf("\n\n\t\\n\n");
    printf("\n\n\t\tWelcome to my Contact Manager\n\n");
    printf("\n\t\t1. First name");
    printf("\n\t\t2. Last name");
    printf("\n\t\t3. List all contacts");
    printf("\n\t\t4. Search email");
    printf("\n\t\t5. Search company name");
    printf("\n\t\t6. Search number");
    printf("\n\t\t7. Add contact");
    printf("\n\t\t8. Edit contact");
    printf("\n\t\t9. Delete contact");
    printf("\n\t\t10. Sort contacts");
    printf("\n\t\t11. Exit");
    printf("\n\n\t\tEnter your menu choice: ");

    do
    {
    local = getchar ();
    if ( (isdigit(local) == FALSE) && (local != '\n') )
        {
        printf ("\nYou must enter an integer.\n");
        printf ("");
    }
    } while (isdigit ((unsigned char) local) == FALSE);

    *iChoice = (int) local - '0';
}

//function to get a contact by entering first name
listelement * getFirst (listelement *listpointer, string query)
{
    //variables
    char query[MAX],firstName[MAX];
    FILE *fp, *ft;
    int i,n,ch,l,found;

    system("cls");
    do
    {
    found=0;


    l=strlen(query);
    fp=fopen("ContactList.txt","r");

    system("cls");
    printf("\n\n..::Search result for '%s' \n===================================================\n",query);
    while(fread(&list,sizeof(list),1,fp)==1)
    {
    for(i=0;i<=l;i++)
    firstName[i]=list.firstName[i];
    firstName[l]='\0';
    if(stricmp(firstName,query)==0)
    {
    printf("\n..::First Name\t: %s\n..::Second Name\t: %ld\n..::Email\t: %s\n..::CompanyName\t:  %s\n..::Number\t:  %s\n",list.firstName,list.lastName,list.email,list.companyName.list.phoneNumber);
    found++;
    if (found%4==0)
    {
    printf("..::Press any key to continue...");
    getch();
    }
    }
    }

    if(found==0)
    printf("\n..::No match found!");
    else
    printf("\n..::%d match(s) found!",found);
    fclose(fp);
    printf("\n ..::Try again?\n\n\t[1] Yes\t\t[11] No\n\t");
    scanf("%d",&ch);
    }while(ch==1);



}

任何人都知道我在代码中出错了吗?谢谢

1 个答案:

答案 0 :(得分:4)

您的错误是因为:

1)你没有在任何地方定义listelement

2)你没有在任何地方定义string(而且它不是C中的类型)

3)您需要在使用之前将#define MAX移到之上。

4)你没有在任何地方定义FALSE(而且它不是C中的类型)

5)你正在重新定义元素,在getFirst()中你传递了query作为“字符串”,然后你    将新的query定义为char数组

6)由于您有多个定义,因此会出现重新定义错误。这有点#5但也有更多。在您的主要内容中,您在此处声明iChoicestring query;int iChoice = 0;  然后在int iChoice;调用

后立即再次声明your Menu()

7)请不要按照C标准<{1}}执行未定义的行为