c语言用另一个链表填充空链表
fill empty linked list from another linked list in c language
我有一个完整的链表,里面有数据,我想要用相同的数据填充另一个链表,但有一个条件,所以假设这是链表:
char cl;
int time;
int lng;
C 0 1
D 0 2
B 2 1
A 2 2
我想从此列表复制到一个新的空列表,但前提是(时间>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 不需要字符串复制)
- while 必须在循环的开头(如果给定列表为空,您的代码将失败)
- 缺少分号
- 新列表连接错误
- 常量正确性错误(
node *head=n;
中缺少常量)
- 内部
head
变量不是必需的(并且参数命名 n
也不理想。如果将其命名为 "start"/"head"/"begin", 评论就不需要了)
另一个建议:为您的结构使用大写名称,因为它更容易区分类型和变量(应该是 Node
,而不是 node)
。
请注意,您可能希望从 return 值类型中删除 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
我有一个完整的链表,里面有数据,我想要用相同的数据填充另一个链表,但有一个条件,所以假设这是链表:
char cl;
int time;
int lng;
C 0 1
D 0 2
B 2 1
A 2 2
我想从此列表复制到一个新的空列表,但前提是(时间>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 不需要字符串复制)
- while 必须在循环的开头(如果给定列表为空,您的代码将失败)
- 缺少分号
- 新列表连接错误
- 常量正确性错误(
node *head=n;
中缺少常量) - 内部
head
变量不是必需的(并且参数命名n
也不理想。如果将其命名为 "start"/"head"/"begin", 评论就不需要了)
另一个建议:为您的结构使用大写名称,因为它更容易区分类型和变量(应该是 Node
,而不是 node)
。
请注意,您可能希望从 return 值类型中删除 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