【问题标题】:C function of linked list wont work链表的C函数不起作用
【发布时间】:2015-02-22 10:54:36
【问题描述】:

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

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 返回 null。 这是函数还是链表的问题?它是否指向正确的值?

【问题讨论】:

  • 使用调试器单步调试您的代码。您的“添加到列表”逻辑似乎已关闭。使用调试器,您可以查看每一步发生的情况,并将其与您的预期进行比较
  • 在函数void addContact(ContactPtr sPtr),你有sPtr=newPtr;。此更改将在函数范围内有效,但在 main 中无效,因为函数在副本上工作。更改为void addContact(ContactPtr* sPtr) 并修改*sPtr
  • pastebin.com/JAfq6ep1有一个不错的链表指南
  • @francis : 我认为指针类型在代码中是 typedefd 的。
  • @limekin:对。然而,如果你想在函数中修改指向某物的指针,你必须传递一个指向某物的指针的指针。 void fun(whatever a){a=b;} 是无用的,无论 a 是什么。函数void fun(whatever* a){*a=b;} 做了一些事情。

标签: c pointers linked-list


【解决方案1】:

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

像这样更改main

addContact(&starPtr);

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2015-08-13
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多