鱼C论坛

 找回密码
 立即注册
查看: 680|回复: 5

[已解决]结构体指针引用,赋值问题

[复制链接]
发表于 2021-8-9 10:38:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 焦糖橙子 于 2021-8-9 10:48 编辑

问题在183行,case 4:delPerson(*contacts);break;
报错信息[Error] no match for 'operator*' (operand type is 'Person')
该怎么改啊写成case 4:delPerson(**contacts);break;这样吗?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Person
{
        char name[40];
        char phone[20];
        struct Person *next;
};

void getInput(struct Person* person);//获取输入联系人信息 
void printPerson(struct Person* person);//打印联系人 
void addPerson(struct Person** contacts);//增加新的联系人 
void changePerson(struct Person* contacts);//更改已有联系人 
void delPerson(struct Person** contacts);//删除已有联系人 
struct Person* findPerson(struct Person* person);//查询已有联系人 
void displayContacts(struct Person* person);//打印通讯录 
void relaseContacts(struct Person** contacts);//结束程序,释放内存 

void getInput(struct Person*person)
{
        printf("请输入姓名:");
        scanf("%s",person->name);
        printf("请输入电话:");
        scanf("%s",person->phone);
}

void addPerson(struct Person**contacts)
{
        struct Person *person;
        struct Person *temp;
        
        person=(struct Person*)malloc(sizeof(struct Person));
        if(person==NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        
        getInput(person);
        
        if(*contacts!=NULL)
        {
                temp=*contacts;
                *contacts=person;
                person->next=temp;
        }
        else 
        {
                *contacts=person;
                person->next=NULL; 
        }
}

void printPerson(struct Person*person)
{
        printf("联系人:%s\n",person->name);
        printf("电话:%s\n",person->phone);
}

struct Person *findPerson(struct Person *contacts)
{
        struct Person*current;
        char input[40];
        
        printf("请输入联系人:");
        scanf("%s",input);
        
        current =contacts;
        while(current!=NULL&&strcmp(current->name,input))
        {
                current=current->next;
        }
        return current;
}

void changePerson(struct Person *contacts)
{
        struct Person*person;
        
        person=findPerson(contacts);
        if(person==NULL)
        {
                printf("找不到该联系人!\n");
        }
        else
        {
                printf("请输入新的联系电话:");
                scanf("%s",person->phone);
        }
}

void delPerson(struct Person**contacts)
{
        struct Person*tenp;
        struct Person*person;
        struct Person*current;
        struct Person*previous;
        
        person=findPerson(*contacts);
        if(person==NULL)
        {
                printf("找不到该联系人!\n");
        }
        else
        {
                current=*contacts;
                previous=NULL;
        
                while(current!=NULL&¤t!=person)
                {
                        previous=current;
                        current=current->next;
                 } 
                 if(previous==NULL)
                 {
                         contacts=*current->next;
                 }
                 else
                 {
                         previous->next=current->next;
                 }

                 free(person);
        }
}

void displayContacts(struct Person*contacts)
{
        struct Person*current;
        while(current!=NULL)
        {
                printPerson(current);
                current=current->next;
        }
} 

void releaseContacts(struct Person **contacts)
{
        struct Person*temp;
        while(*contacts!=NULL)
        {
                temp=*contacts;
                *contacts=(*contacts)->next;
                free(temp);
        }
}

int main(void)
{
        int code;
        struct Person *contacts=NULL;
        struct Person *person;
        
        printf("| 欢迎使用通讯录管理程序 |\n");
        printf("|--- 1:插入新的联系人 ---|\n");
        printf("|--- 2:查找已有联系人 ---|\n");
        printf("|--- 3:更改已有联系人 ---|\n");
        printf("|--- 4:删除已有联系人 ---|\n");
        printf("|--- 5:显示当前通讯录 ---|\n");
        printf("|--- 6:退出通讯录程序 ---|\n");
        printf("|- Powered by FishC.com -|\n");
        
        while(1)
        {
                printf("\n请输入指令代码:");
                scanf("%d",&code);
                switch(code)
                {
                        case 1:addPerson(&contacts);break;
                        case 2:person = findPerson(contacts);
                        if(person==NULL)
                        {
                                printf("找不到该联系人!\n");
                        }
                        else 
                        {
                                printPerson(contacts);
                        }
                        break;
                        case 3:changePerson(contacts);break;
                        case 4:delPerson(*contacts);break;
                        case 5:displayContacts(contacts);break;
                        case 6:goto END;
                }
        }
END:
        relaseContacts(&contacts);
        
        
        return 0;
}
最佳答案
2021-8-9 10:50:00
        显然应该改为
case 4:delPerson(& contacts);break;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-9 10:50:00 | 显示全部楼层    本楼为最佳答案   
        显然应该改为
case 4:delPerson(& contacts);break;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-9 10:55:31 | 显示全部楼层

突然想通了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-9 10:59:55 | 显示全部楼层

改完还是有错,这什么意思啊....

[Error] ld returned 1 exit status
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-9 11:30:56 | 显示全部楼层
本帖最后由 jackz007 于 2021-8-9 11:33 编辑
焦糖橙子 发表于 2021-8-9 10:59
改完还是有错,这什么意思啊....

[Error] ld returned 1 exit status

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

struct Person
{
        char name[40];
        char phone[20];
        struct Person *next;
};

void getInput(struct Person*person)
{
        printf("请输入姓名:");
        scanf("%s",person->name);
        printf("请输入电话:");
        scanf("%s",person->phone);
}

void addPerson(struct Person**contacts)
{
        struct Person *person;
        struct Person *temp;
        
        person=(struct Person*)malloc(sizeof(struct Person));
        if(person==NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        
        getInput(person);
        
        if(*contacts!=NULL)
        {
                temp=*contacts;
                *contacts=person;
                person->next=temp;
        }
        else 
        {
                *contacts=person;
                person->next=NULL; 
        }
}

void printPerson(struct Person*person)
{
        printf("联系人:%s\n",person->name);
        printf("电话:%s\n",person->phone);
}

struct Person * findPerson(struct Person * contacts)
{
        struct Person*current;
        char input[40];
        
        printf("请输入联系人:");
        scanf("%s",input);
        
        current =contacts;
        while(current!=NULL&&strcmp(current->name,input))
        {
                current=current->next;
        }
        return current;
}

void changePerson(struct Person *contacts)
{
        struct Person*person;
        
        person=findPerson(contacts);
        if(person==NULL)
        {
                printf("找不到该联系人!\n");
        }
        else
        {
                printf("请输入新的联系电话:");
                scanf("%s",person->phone);
        }
}

void delPerson(struct Person ** contacts)
{
        struct Person * tenp     ;
        struct Person * person   ;
        struct Person * current  ;
        struct Person * previous ;
        
        person = findPerson(* contacts) ;
        if(person == NULL)
        {
                printf("找不到该联系人!\n") ;
        }
        else
        {
                current = * contacts ;
                previous = NULL      ;
        
                while(current != NULL && current != person)
                {
                        previous = current        ;
                        current = current -> next ;
                 } 
                 if(previous == NULL)
                 {
                         contacts = & current -> next ;
                 }
                 else
                 {
                         previous -> next = current -> next ;
                 }

                 free(person) ;
        }
}

void displayContacts(struct Person*contacts)
{
        struct Person*current;
        while(current!=NULL)
        {
                printPerson(current);
                current=current->next;
        }
} 

void releaseContacts(struct Person **contacts)
{
        struct Person * temp ;
        while(*contacts != NULL)
        {
                temp = * contacts         ;
                * contacts = temp -> next ;
                free(temp)                ;
        }
}

int main(void)
{
        int code;
        struct Person *contacts=NULL;
        struct Person *person;
        
        printf("| 欢迎使用通讯录管理程序 |\n");
        printf("|--- 1:插入新的联系人 ---|\n");
        printf("|--- 2:查找已有联系人 ---|\n");
        printf("|--- 3:更改已有联系人 ---|\n");
        printf("|--- 4:删除已有联系人 ---|\n");
        printf("|--- 5:显示当前通讯录 ---|\n");
        printf("|--- 6:退出通讯录程序 ---|\n");
        printf("|- Powered by FishC.com -|\n");
        
        while(1)
        {
                printf("\n请输入指令代码:");
                scanf("%d",&code);
                switch(code)
                {
                        case 1:addPerson(&contacts);break;
                        case 2:person = findPerson(contacts);
                        if(person==NULL)
                        {
                                printf("找不到该联系人!\n");
                        }
                        else 
                        {
                                printPerson(contacts);
                        }
                        break;
                        case 3:changePerson(contacts);break;
                        case 4:delPerson(& contacts);break;
                        case 5:displayContacts(contacts);break;
                        case 6:goto END;
                }
        }
END:
        releaseContacts(&contacts);
        return 0;
}
        只是保证可以正常编译,至于功能,请自行测试修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-9 16:43:11 | 显示全部楼层
重新检查了一下,更正了功能2和功能5的错误

正确代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Person
{
    char name[40];
    char phone[20];
    struct Person* next;
};

void getInput(struct Person* person);//获取输入联系人信息 
void printPerson(struct Person* person);//打印联系人 
void addPerson(struct Person** contacts);//增加新的联系人 
void changePerson(struct Person* contacts);//更改已有联系人 
void delPerson(struct Person** contacts);//删除已有联系人 
struct Person* findPerson(struct Person* person);//查询已有联系人 
void displayContacts(struct Person* person);//打印通讯录 
void relaseContacts(struct Person** contacts);//结束程序,释放内存 

void getInput(struct Person* person)
{
    printf("请输入姓名:");
    scanf("%s", person->name);
    printf("请输入电话:");
    scanf("%s", person->phone);
}

void addPerson(struct Person** contacts)
{
    struct Person* person;
    struct Person* temp;

    person = (struct Person*)malloc(sizeof(struct Person));
    if (person == NULL)
    {
        printf("内存分配失败!\n");
        exit(1);
    }

    getInput(person);

    if (*contacts != NULL)
    {
        temp = *contacts;
        *contacts = person;
        person->next = temp;
    }
    else
    {
        *contacts = person;
        person->next = NULL;
    }
}

void printPerson(struct Person* person)
{
    printf("联系人:%s\n", person->name);
    printf("电话:%s\n", person->phone);
}

struct Person* findPerson(struct Person* contacts)
{
    struct Person* current;
    char input[40];

    printf("请输入联系人:");
    scanf("%s", input);

    current = contacts;
    while (current != NULL && strcmp(current->name, input))
    {
        current = current->next;
    }
    return current;
}

void changePerson(struct Person* contacts)
{
    struct Person* person;

    person = findPerson(contacts);
    if (person == NULL)
    {
        printf("找不到该联系人!\n");
    }
    else
    {
        printf("请输入新的联系电话:");
        scanf("%s", person->phone);
    }
}

void delPerson(struct Person** contacts)
{
    struct Person* tenp;
    struct Person* person;
    struct Person* current;
    struct Person* previous;

    person = findPerson(*contacts);
    if (person == NULL)
    {
        printf("找不到该联系人!\n");
    }
    else
    {
        current = *contacts;
        previous = NULL;

        while (current != NULL && current != person)
        {
            previous = current;
            current = current->next;
        }
        if (previous == NULL)
        {
            *contacts = current->next;
        }
        else
        {
            previous->next = current->next;
        }

        free(person);
    }
}

void displayContacts(struct Person* contacts)
{
    struct Person* current;
    current = contacts;
    while (current != NULL)
    {
        printPerson(current);
        current = current->next;
    }
}

void relaseContacts(struct Person** contacts)
{
    struct Person* temp;
    while (*contacts != NULL)
    {
        temp = *contacts;
        *contacts = temp->next;
        free(temp);
    }
}

int main(void)
{
    int code;
    struct Person* contacts = NULL;
    struct Person* person;

    printf("| 欢迎使用通讯录管理程序 |\n");
    printf("|--- 1:插入新的联系人 ---|\n");
    printf("|--- 2:查找已有联系人 ---|\n");
    printf("|--- 3:更改已有联系人 ---|\n");
    printf("|--- 4:删除已有联系人 ---|\n");
    printf("|--- 5:显示当前通讯录 ---|\n");
    printf("|--- 6:退出通讯录程序 ---|\n");
    printf("|- Powered by FishC.com -|\n");

    while (1)
    {
        printf("\n请输入指令代码:");
        scanf("%d", &code);
        switch (code)
        {
        case 1:addPerson(&contacts); break;
        case 2:person = findPerson(contacts);
            if (person == NULL)
            {
                printf("找不到该联系人!\n");
            }
            else
            {
                printPerson(person);
            }
            break;
        case 3:changePerson(contacts); break;
        case 4:delPerson(&contacts); break;
        case 5:displayContacts(contacts); break;
        case 6:goto END;
        }
    }
END:
    relaseContacts(&contacts);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表