问题及代码:
/*
*Copyright (c)2016,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:bigice.cbp
*作 者:何大冰
*完成日期:2016年9月29日
*版 本 号:v1.0
*
*问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结
点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。
*输入描述:无
*程序输出:整理后的链表
*/
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void split(LinkList *&L,LinkList *&L1,LinkList *&L2)
{
LinkList *p=L->next,*q,*r1; //p指向第1个数据节点
L1=L; //L1利用原来L的头节点
r1=L1; //r1始终指向L1的尾节点
L2=(LinkList *)malloc(sizeof(LinkList)); //创建L2的头节点
L2->next=NULL; //置L2的指针域为NULL
while (p!=NULL)
{
r1->next=p; //采用尾插法将*p(data值为ai)插入L1中
r1=p;
p=p->next; //p移向下一个节点(data值为bi)
q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点
p->next=L2->next; //采用头插法将*p插入L2中
L2->next=p;
p=q; //p重新指向ai+1的节点
}
r1->next=NULL; //尾节点next置空
}
int main()
{
LinkList *L,*L1,*L2;
int i;
ElemType a[]= {1,2,3,4,5,6,7,8,9,10};
InitList(L);
InitList(L1);
InitList(L2);
for(i=9; i>=0; i--)
ListInsert(L, 1, a[i]);
printf("L:");
DispList(L);
printf("L->L1,L2\n");
split(L,L1,L2);
printf("L1:");
DispList(L1);
printf("L2:");
DispList(L2);
DestroyList(L1);
DestroyList(L2);
return 0;
}
运行结果:
知识点总结:
单链表的逆置。
心得体会:体会了单链表的应用,对单链表知识点的掌握更加完善了