0

我正在使用双向链表编写联系人管理器,该双向链表由函数使用读取 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);



}

有人知道我在代码中哪里出错了吗?谢谢

4

1 回答 1

4

您的错误是因为:

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

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

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

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

5)您也在重新定义元素,因为getFirst()您已query作为“字符串”传入,然后将新元素定义query为 char 数组

6)你得到重新定义错误,因为你有不止一个定义。这有点#5,但还有更多。在你的主要你iChoice在这里声明:string query;int iChoice = 0; 然后你int iChoice;your Menu()调用后再次声明它

7) 请不要fflush(stdin)按照 C 标准这样做是未定义的行为

于 2013-03-13T19:46:02.193 回答