我有一个函数,它从用户那里获取一些数据,使用这些数据创建一个结构,并将该结构添加到一个链表中。但它不会将数据保存到链接列表:

typedef struct contact Contact;
typedef Contact *ContactPtr;
int main(){
    ContactPtr starPtr;
    addContact(starPtr);
    printf("## %s", starPtr->firstName);
    return 0;
}
void addContact(ContactPtr sPtr){
printf("\n FF:\n");
ContactPtr newPtr;
ContactPtr prevPtr;
ContactPtr currentPtr;
newPtr = malloc(sizeof(Contact));
char fN[20];
char sN[20];
char phN[12];
scanf("%s", &fN);
scanf("%s", &sN);
scanf("%s", &phN);

if (newPtr!=NULL){
    strcpy(newPtr->firstName, fN);
    strcpy(newPtr->surName, sN);
    strcpy(newPtr->phoneNo, phN);


    newPtr->next=NULL;
    prevPtr = NULL;
    currentPtr=sPtr;

    while(currentPtr!=NULL){

        prevPtr=currentPtr;
        currentPtr=currentPtr->next;
    }

    if(prevPtr==NULL){
            printf("!!@");
        newPtr->next=sPtr;
        sPtr=newPtr;
    }
    else{
        prevPtr->next=newPtr;
        newPtr->next=currentPtr;
    }
}
else{
printf("$$WRONG");
}
}

程序为starPtr->firstName返回空值。
这是函数的问题还是链接列表的问题?它是否指向正确的值?

最佳答案

main中,您有:

ContactPtr starPtr;
addContact(starPtr);

addContact定义为:
void addContact(ContactPtr sPtr){

不可能addContact修改startPtr,这就是为什么它从不指向任何有用的东西。
如果它是C++,则可以将代码更改为:
void addContact(ContactPtr& sPtr){

这样,您将传递对startPtr的引用,并且可以在addContact中对其进行修改。
但是如果是C,就必须使用指向指针的指针,比如
void addContact(ContactPtr* sPtr){

addContact内部,用sPtr替换*sPtr
改变如下:
addContact(&starPtr);

关于c - 链表的C功能不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28657006/

10-11 19:14