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