【发布时间】: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