我有一个包含数据的完整链表,我想要的是用相同的数据填充另一个链表,但有一个条件,所以假设这是链表:
char cl;
int time;
int lng;
C 0 1
D 0 2
B 2 1
A 2 2
我想从这个列表复制到一个新的空列表,但前提是(time>0),所以新的列表将是这样的:
B 2 1
A 2 2
我已经尝试过这段代码,但它不起作用:
void insert(const node * n )// this where i put the pointer of the full node
{
node *head=n;
node *sec; // new node
sec=(node*)malloc(sizeof(node));
do{
if(head->time>0){
strcpy(sec->cl,head->cl);
sec->time= head->time;
sec->lng= head->lng;
head=head->next;
sec=sec->next;
}
else
head=head->next;
}while(head!=NULL);
print(sec) // this will print the new node
}
请帮帮我。谢谢
我结合了评论中的所有建议以及一些额外的修复。 下面是生成的代码:
const node* insert(const node * head)
{
node *sec = NULL; // start of the new, second list
node *last = NULL; // points to the last inserted node
while(head!=NULL){
if(head->time > 0){
node* newsec=(node*)malloc(sizeof(node));
newsec->cl = head->cl;
newsec->time = head->time;
newsec->lng = head->lng;
newsec->next = NULL;
//Add the new node to the list:
if(last == NULL){ //This is the first element in the new list
sec = newsec;
}else{
last-> next = newsec;
}
last = newsec;
}
head=head->next;
}
print(sec); // this will print the new node
return sec;
}
你的错误:
- 内存分配
- 错误(您只分配了一次内存)
- 不需要 strcpy (char's 不需要字符串副本)
- 而必须位于循环的开头(如果给定列表为空,您的代码将失败)
- 缺少分号
- 新列表的连接错误 错误的常量
- 正确性(
node *head=n;
中缺少常量) - 内部
head
变量不是必需的(参数命名n
也不理想。如果您将其命名为"开始"/"头"/"开始",则不需要注释)
另一个建议:为您的结构使用大写名称,因为它可以更轻松地区分类型和变量(应该是Node
,而不是node)
。
请注意,您可能希望从返回值类型中删除const
。
// Note: a better function name might be: printNodesWithTime
void insert(const node * pOld )
{
// note: since nothing is done with the new linked list,
// there is no need to actually create it
while( NULL != pOld )
{
if(pPld->time > 0)
{
print(pOld) // this will print the node
}
// step to next old node
pOld = pOld->next;
} // end while
} // end function: insert