c语言线性链表就地逆置,C语言:单链表实现(二) 就地逆置,就地归并

该博客主要展示了如何使用C++实现单链表的后插法创建、逆置以及就地归并操作。首先,通过后插法创建了一个单链表,并输出其元素。然后,使用就地逆置函数将链表逆置,并再次输出。接着,创建第二个链表并进行逆置。最后,将两个逆置后的链表进行就地归并,并输出结果。整个过程详细展示了链表操作的基本步骤和实现技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

#define LEN sizeof(struct Nodelist)

using namespace std;

typedef struct Nodelist

{

int data;;

struct Nodelist *next;

}Nodelist;

//函数声明

void Error(char *s); //错误处理函数

Nodelist *CreatNode(void); //后插法创建单链表

Nodelist *ReverseList(Nodelist *head); //就地逆置函数

void MeryNode(Nodelist &l1, Nodelist &l2); //就地归并函数

void printNode(Nodelist L); //输出函数

//函数定义

void Error(char *s) //错误处理函数

{

cout << s << endl;

exit(1);

}

Nodelist *CreatNode(void) //后插法创建单链表

{

int i, n;

Nodelist *head, *p, *q;

p = q = NULL;

head = NULL;

cout << "请输入您要建立的链表长度:";

cin >> n;

cout << "请输入您要输入的数据:" << endl;;

for (i = 0; i

{

p = (Nodelist *)malloc(LEN);

cin >> p->data;

if (head == NULL) //单个结点

q = head = p;

else

q->next = p;

q = p;

}

p->next = NULL;

return head;

}

void printNode(Nodelist L) //将链表依次数据输出

{

Nodelist *p = &L;

while (p)

{

cout << p->data << " ";

p = p->next;

}

cout << endl;

}

Nodelist *ReverseList(Nodelist *head) //就地逆置函数

{

Nodelist *p, *q, *r;

p = head;

q = r = NULL;

while (p)

{

q = p->next;

p->next = r;

r = p;

p = q;

}

return r;

}

void MeryNode(Nodelist &l1, Nodelist &l2) //就地归并函数

{

Nodelist *pa, *pb, *pc, *pd;

pa = &l1;

pb = &l2;

pc = pa;

while (pa&&pb)

{

if (pa->data <= pb->data)

{

pc = pa;

pa = pa->next;

}

else

{

pd = pb->next;

pb->next = pa;

pc->next = pb;

pc = pb;

pb = pd;

}

}

if (pb!=NULL)

pc->next = pb;

}

int main() //主函数测试

{

Nodelist *head1, *head2;

head1 = CreatNode();

cout << "逆置前的链表数据:" << endl;

printNode(*head1);

Nodelist *head3 = ReverseList(head1);

cout << "逆置后的链表数据:" << endl;

printNode(*head3);

head2 = CreatNode();

cout << "逆置前的链表数据:" << endl;

printNode(*head2);

Nodelist *head4 = ReverseList(head2);

cout << "逆置后的链表数据:" << endl;

printNode(*head4);

cout << "就地归并后:" << endl;

MeryNode(*head3, *head4);

printNode(*head3);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值