c-如何从其他void函数中获取LinkedList地址


  1. 我想反转链表,为reverse2函数提供头指针参数。

  2. 我希望reverse2函数反转链表,并将地址替换为头指针


//linked list//

typedef struct node* lsnode;
typedef struct node 
{
int data;
lsnode link;
}node;


//create the 3 nodes

lsnode create3() 
{
lsnode first, second, last;

first = (lsnode)malloc(sizeof(node));
second = (lsnode)malloc(sizeof(node));
last = (lsnode)malloc(sizeof(node));
first->data = 30;
first->link = second;
second->data = 20;
second->link = last;
last->data = 10;
last->link = NULL;

return first;
}

//reverse the linkedlist
void reverse2(lsnode head)
{
lsnode q,p,r;
p = head;
q = NULL;
r = NULL;
while (p != NULL)
{
r = q;
q = p;
p = p->link;
q->link = r;
}
head = p;
}


int main(void)
{
lsnode head = create3();
reverse2(head);
while (head)
{
printf("%dn", head->data);
head = head->link;
}
return 0;
}

程序只打印30,但是,我想打印10 20 30我的代码有什么问题。。

根据注释中的一些建议,以下修改reverse2函数以传递被更改对象的地址,而不是对象本身,从而允许在返回时在调用函数中引用修改后的对象。关于@Some程序员dude关于可视化价值的建议,我发现这很有帮助
此外,为了使代码更易于理解,此代码将单字母变量名扩展为任何阅读代码的人都能更容易理解的符号。

typedef struct node* lsnode;
typedef struct node 
{
int data;
lsnode next;//changed from link
}node;

//create the 3 nodes
lsnode create3() 
{
lsnode first, second, last;

first = (lsnode)malloc(sizeof(node));
second = (lsnode)malloc(sizeof(node));
last = (lsnode)malloc(sizeof(node));
first->data = 30;
first->next = second;
second->data = 20;
second->next = last;
last->data = 10;
last->next = NULL;
return first;
}
//reverse the linkedlist
void reverse2(lsnode *head)//changed prototype, 
{
//lsnode q,p,r;
lsnode prev,current,next;//note these changes throughout
current = *head;//note use of asterisk to reference 
//object being changed 
prev = NULL;
next = NULL;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}

int main(void)
{
lsnode head = create3();
reverse2(&head);//passes address of object to be modified
while (head)
{
printf("%dn", head->data);
head = head->next;
}
return 0;
}

输出:

10
20
30

最新更新