1、数据结构线性链表数据结构与算法分析课 程 实 验 报 告 项目名称:线性链表的操作学生姓名:学生学号:指导教师:完成日期:【实验目的】1. 理解线性表的链式存储原理 。2. 掌握链表的常用操作算法。【实验内容】1. 创建链表并对其进行输出;2. 利用指针实现对两个线形链表的合并,并输出其结果。【实验方式】个人实验。【实验设备与环境】 PC机,Windows XP操作系统,VC+6.0开发环境【数据结构及函数定义】 以下给出的只是范例,请同学们根据自己编写的程序内容进行填写(1)类的定义:类的数据成员,成员函数 class link 表类 /数据成员public:int element;节点值l
2、ink *next;指向表中下一节点的指针/成员函数link(const int& elemval,link*nextval=NULL) 构造函数1 element=elemval;next=nextval; 给定节点值 link(link*nextval=NULL)构造函数2 next=nextval; link()析构函数 (2)主函数main() 实现初始化操作,完成对子函数的调用 (3)子函数 link *creat() 创建链表 void printlist(link *lp) 输出链表 link *comb(link *la, link *lb) 合并链表【测试数据与实验结果】测试
3、数据: la =2 3 5 6 lb= 4 5 7 8 实验结果: 链表la(2.3.5.6)与链表(4.5.7.8)合并后得到链表(2.3.4.5.6.7.8) 【源程序清单】(请附上源程序)#include using namespace std;/* 单链表节点 */struct nodeint value;node* next;/* 给单链表添加节点 */void insertNode(node* head, int value)node* p = head-next;if ( p = NULL ) p = new node; p-value = value; p-next = NUL
4、L; head-next = p; return;while ( p-next != NULL ) p = p-next;node* tmp = new node;tmp-value = value;tmp-next = NULL;p-next = tmp;/* 遍历输出链表节点 */void print(node* head)node* p = head-next;while ( p != NULL ) cout value next;cout next = NULL;node* p = headA-next;node* q = headB-next;if ( p = NULL ) retu
5、rn headB;if ( q = NULL ) return headA;while ( (p != NULL) & (q != NULL) ) if ( p-value = q-value ) insertNode(head, p-value); insertNode(head, q-value); p = p-next; q = q-next; else if ( p-value value ) insertNode(head, p-value); p = p-next; else if ( p-value q-value ) insertNode(head, q-value); q =
6、 q-next; while ( p != NULL ) insertNode(head, p-value); p = p-next;while ( q != NULL ) insertNode(head, q-value); q = q-next;return head;/* 下面实现不使用任何库函数, 利用交换的方法在原空间实现整体有序。 方法是先确定哪一个链表的第一个节点的值小,把这个链表的头结点作为合并后链表的头结点,然后比较2个有序链表的当前节点的值,如果代表最后合并链表的值小,则不用交换,否则把两个值交换,最后合并链表始终保持两个值中的小值。另一个链表由于交换了一个元素,当前元素可
7、能影响该链表的有序递增,对其进行调整使其保持递增有序,然后重复上述动作,直到一个链表遍历结束,然后把剩余的链表连接起来就行。*/* 调整链表的第一个节点,使其变成递增有序 */void chg2sort(node* head, node* &p)if (head-next = NULL ) /没有节点,直接返回 return;node* s = head;while ( s-next != p ) /s指向p的前一个节点 s = s-next;/下面的一段找到第一个大于p节点值的节点node* q = p;node* r = q;while ( q != NULL ) if ( q-value
8、 value ) r = q; /r始终指向q的前一个节点 q = q-next; else break; /下面调整指针,其实可以统一写出来,为了阅读清晰把q为NULL和非NULL分开写出来if ( q = NULL ) r-next = p; s-next = p-next; p-next = NULL;else if ( q != NULL ) s-next = p-next; r-next = p; p-next = q;/由于链表进行了调换,当前链表指针也需要改变p = s-next;/* 两个有序链表进行合并 */node* merge(node* head1, node* hea
9、d2)node* head; /合并后的头指针node* p = head1-next;node* q = head2-next;/有一个链表为空的情况,直接返回另一个链表if ( p = NULL ) head = head2; return head;else if ( q = NULL ) head = head1; return head;/两个都不为空,先确定哪个链表作为合并后的链表if ( (p != NULL) & (q != NULL) ) if ( p-value value ) head = head1; else head = head2; node* p_prior;
10、/始终指向p节点的前一个节点node* q_prior;while ( (p != NULL) & (q != NULL) ) if ( p -value value ) if ( head = head1 ) p_prior = p; p = p-next; else if ( head = head2 ) /进行当前节点值的交换 int tmp = p-value; p-value = q-value; q-value = tmp; chg2sort(head1, p); /交换元素后的调整 q_prior = q; q = q-next; else if ( p-value = q-va
11、lue ) p_prior = p; p = p-next; q_prior = q; q = q-next; else if ( p-value q-value ) if ( head = head1 ) int tmp = p-value; p-value = q-value; q-value = tmp; chg2sort(head2, q); p_prior = p; p = p-next; else if ( head = head2 ) q_prior = q; q = q-next; if ( p != NULL ) q_prior-next = p;if ( q != NULL
12、 ) p_prior-next = q;return head;void main()/* 建立有序链表A */int a5 = 1, 3, 5, 7, 9;int i;node* headA = new node;headA-next = NULL;for ( i = 0; i next = NULL;for (i = 0; i 5; +i) insertNode(headB, bi);print(headB);/* 利用简单合并的方法合并成整体有序 */node* head = formalMerge(headA, headB);print(head);【测试数据与实验结果】上课纪律(20%)实验过程及结果(40%)实验报告质量(40%)总分:教师签字:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1