一、采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。
二、把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。
三、(1)(2)(3)(4)的主函数
采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。
// 采用归并的方法,将两个升序的链表La和Lb,合并成一个升序的链表Lc。
int MergeList(LinkList La, LinkList Lb, LinkList Lc)
{
if ((La == NULL) || (Lb == NULL) || (Lc == NULL))
{
printf("表La、Lb、Lc至少有一个不存在。\n");
return 0;
}
La = La->next;
Lb = Lb->next;
LNode* pp;
//把La和Lb合并到Lc中
while ((La != NULL) && (Lb != NULL))
{
if (La->data <= Lb->data)
{
pp = La;
La = La->next;
}
else
{
pp = Lb;
Lb = Lb->next;
}
//把较小者追加到Lc中
Lc->next = (LNode*)malloc(sizeof(LNode));//分配一个新结点
Lc = Lc->next;
memcpy(&Lc->data, &pp->data, sizeof(ElemType));
Lc->next = NULL;
}
//把链表La其他元素追加到Lc中
while (La != NULL)
{
Lc->next = (LNode*)malloc(sizeof(ElemType));//分配一个新结点
Lc = Lc->next;
memcpy(&Lc->data, &La->data, sizeof(ElemType));
Lc->next = NULL;
La = La->next;
}
// 把链表Lb其它的元素追加到Lc中。
while (Lb != NULL)
{
Lc->next = (LNode*)malloc(sizeof(LNode)); // 分配一个新结点。
Lc = Lc->next;
memcpy(&Lc->data, &Lb->data, sizeof(ElemType));
Lc->next = NULL;
Lb = Lb->next;
}
return 1;
}
以下代码显示两个链表的合并,把两个有序的La和Lb合并成有序的Lc。
LinkList La,Lb,Lc;
La=InitList1();
Lb=InitList1();
Lc=InitList1();
ee=1; PushBack(Lb, &ee);
ee=2; PushBack(La, &ee);
ee=3; PushBack(Lb, &ee);
ee=4; PushBack(Lb, &ee);
ee=5; PushBack(La, &ee);
ee=6; PushBack(Lb, &ee);
ee=7; PushBack(Lb, &ee);
ee=8; PushBack(Lb, &ee);
ee=9; PushBack(La, &ee);
ee=10; PushBack(La, &ee);
PrintList(La);
PrintList(Lb);
MergeList(La,Lb,Lc);
PrintList(Lc);
DestroyList1(La); La=NULL;
DestroyList1(Lb); Lb=NULL;
DestroyList1(Lc); Lc=NULL;
把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。
// 把链表pp结点之后的结点原地逆置(反转),返回值:0-失败;1-成功。
void ReverseList(LNode* pp)
{
LNode* ss; // 当前结点。
LNode* ssnext; // 当前结点的下一结点。
ss = pp->next; // 从pp结点之后的结点开始反转。
pp->next = NULL; // pp->next指向空。
while (ss != NULL)
{
ssnext = ss->next; // 保留ss下一结点的地址。
// 以下两行相当于在pp之后插入ss结点。
ss->next = pp->next;
pp->next = ss;
ss = ssnext; // ss结点后移。
}
}
(1)(2)(3)(4)的主函数
int main()
{
LinkList LL = NULL; // 声明链表指针变量。
LL = InitList1(); // 初始化链表。
printf("LL=%p\n", LL);
ElemType ee; // 创建一个数据元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee = 1; InserList(LL, 1, &ee);
ee = 2; InserList(LL, 1, &ee);
ee = 3; InserList(LL, 1, &ee);
ee = 4; InserList(LL, 1, &ee);
ee = 5; InserList(LL, 1, &ee);
ee = 6; InserList(LL, 1, &ee);
ee = 7; InserList(LL, 1, &ee);
ee = 8; InserList(LL, 1, &ee);
ee = 9; InserList(LL, 1, &ee);
ee = 10; InserList(LL, 1, &ee);
printf("length=%d\n", LengthList(LL));
PrintList(LL);
printf("在第5个位置插入元素(13)。\n");
ee = 13; InserList(LL, 5, &ee);
PrintList(LL);
printf("在表头插入元素(11),表尾插入元素(12)。\n");
ee = 11; PushFront(LL, &ee);
ee = 12; PushBack(LL, &ee);
PrintList(LL);
printf("删除表中第7个结点。\n");
DeleteNode(LL, 7); PrintList(LL);
printf("删除表中第一个结点。\n");
PopFront(LL); PrintList(LL);
printf("删除表中最后一个结点。\n");
PopBack(LL); PrintList(LL);
LNode* tmp;
if ((tmp = LocateNode(LL, 3)) != NULL)
printf("第3个结点的地址是=%p,ee=%d\n", tmp, tmp->data);
ee = 8;
if ((tmp = LocateElem(LL, &ee)) != NULL)
printf("元素值为8的结点的地址是=%p\n", tmp);
else
printf("元素值为8的结点的地址是NULL,没找着。\n");
printf("在结点%p之后插入66\n", tmp);
ee = 66;
InsertNextNode(tmp, &ee); PrintList(LL);
printf("在结点%p之前插入55\n", tmp);
ee = 55;
InsertPriorNode(tmp, &ee); PrintList(LL);
// ReverseList(LL); PrintList(LL); // 反转链表。
DestroyList1(LL); LL = NULL; // 销毁链表,LL置为空。
printf("LL=%p\n", LL);
system("pause");
return 0;
}