c-链表头地址循环在一起并发生变化



strong text我创建了两个结构体,供体和读取。

struct stored
{
char *string;
struct stored*link;
};
struct donor
{
char *id;
struct donor* link;
};

1 FM SA 1 1.0

2 FM SG 2 4.0

3 OM AU 1 0.5

这里的目标是读取testing.txt的包含捐赠详细信息行的行(如上所示(,将每一行字符串保存在链表中(存储(,然后循环(存储(在每个节点再次获得字符串,将字符串拆分为空格分隔的值,创建一个结构Donor,然后将第一个索引值存储到Donor*节点中->id。当完成循环(存储(时,我们将创建另一个具有所有id(1-5(的链表(Donor(。这里的问题是,我的head1指针地址与循环一起循环,并且我丢失了地址。这是代码:

typedef struct stored Stored;
typedef struct donor Donor;
Stored *head, *current ; 
Donor *head1, *current1 ; 
void print(Stored* head){
Stored* current_node = head;
while(current_node!= NULL){
printf("%sn", current_node->id);
current_node = current_node->link;
}
}

int main(void){
char line[128];
FILE * fp;

head  = current  = NULL; 
fp = fopen("testing.txt","r");

while(fgets(line, sizeof(line), fp)){
Stored *node = malloc(sizeof(Stored));
node->string = strdup(line);

node->link = NULL;
if(head == NULL){
current = head = node;
} 
else{
current = current->link = node;
}
}
print(head);


Stored*temp = head;   
char *stemp;
char newString[10][10];
int j, i, ctr;
head1  = current1  = NULL; 
while(temp != NULL){
stemp = temp->string ;
j=0; ctr=0;
for(i=0;i<=(strlen(stemp));i++){
// if space or NULL found, assign NULL into newString[ctr]
if(stemp[i]==' '||stemp[i]==''){
newString[ctr][j]='';
ctr++;  //for next word
j=0;    //for next word, init index to 0
}
else{
newString[ctr][j]=stemp[i];
j++;
}
}
Donor *node = malloc(sizeof(Donor));
node-> id = newString[0];
node->link = NULL;


if(head1 == NULL){
current1 = head1 = node;

} 
else{
current1 = current1->link = node;
}   
temp = temp->link;
}
print(head1);

}

当使用print((时,它循环通过给定的头地址并返回字符串或id,它输出

1 FM SA 1 1.0
2 FM SG 2 4.0
3 OM AU 1 0.5
4 SM DE 3 6.0
5 HS US 2 7.5
5
5
5
5
5

我怀疑,在else期间,head1也会将自己更新为current1地址。当调用打印(head1(时,其id从5开始。我在这里做错了什么?

if(head1 == NULL){
current1 = head1 = node;
} 
else{
current1 = current1->link = node;
}

这里的教训是在复制指针时要非常小心,不要认为复制/存储字符串是一样的。

node-> id = newString[0];

正如有人指出的,它与node->id=&newString[0][0]

node-> id = strdup(newString[0]);

这修复了一切。

相关内容

  • 没有找到相关文章

最新更新