数据结构实验四 线性表的基本操作及应用

简介: 数据结构实验四 线性表的基本操作及应用

一、 实验目的

1、掌握线性表的逻辑结构

2、熟练掌握线性表的链式存储结构定义及基本操作

3、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力

二、 实验要求

1、演示程序运行结果

2、分析调试过程中出现的现象

3、总结单链表基本操作的特点

4、分析算法的时间复杂度

三、实验内容

编写程序,实现一元多项式的创建、求和等基本操作算法。

(1) 根据一元多项式创建单链表。

(2) 实现两个多项式的求和。

(3) 输出求和结果。

1. #include<iostream>
2. #include<string>
3. #include<fstream>
4. using namespace std;
5. #define ERROR 0
6. 
7. typedef struct PNode {
8.  float coef; //系数
9.  int expn; //指数
10.   struct PNode *next;
11. } PNode, *Polynomial;
12. string head_1, head_2;
13. int temp;
14. char st = 'A';
15. 
16. void CreatPolyn(Polynomial &P, int m) //算法2.18 多项式的创建
17. {
18.   //输入m项的系数和指数,建立表示一个多项式的有序链表P
19.   Polynomial q, pre, s;
20.   int i;
21.   P = new PNode;
22.   P->next = NULL; //先建立一个带头结点的单链表
23.   char filename[20] = { 0 };
24.   cout << "请输入有关多项式p" << char(st + 32)  << endl;
25.   ++st;
26.   gets(filename);
27.   fstream file;
28.   file.open(filename);
29.   if (!file) {
30.     cout << "未找到相关文件,无法打开!" << endl;
31.     exit(ERROR);
32.   }
33.   file >> head_1 >> head_2;
34.   while (!file.eof())
35.   {
36.     s = new PNode; //生成新结点
37.     file >> s->coef >> s->expn; //输入元素值
38.     pre = P; //pre用于保存q的前驱,初值为头结点
39.     q = P->next;
40.     while (q && q->expn < s->expn) //通过比较指数找到第一个大于输入项指数的项q
41.     {
42.       pre = q;
43.       q = q->next;
44.     } //while
45.     s->next = q; //将输入项s插入到q和其前驱结点pre之间
46.     pre->next = s;
47.   }//for
48.   file.close();
49. } //CreatPolyn
50. 
51. void AddPolyn(Polynomial &Pa, Polynomial &Pb) //算法2.19 多项式的相加
52. {
53.   //多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成"和多项式"
54.   Polynomial r, p1, p2, p3;
55.   float sum;
56.   p1=Pa->next;  //补充代码
57.     p2=Pb->next;  //补充代码
58. //p1和p2初值分别指向Pa和Pb的第一个结点
59.   p3=Pa;  //补充代码
60. //p3指向和多项式的当前结点,初值为Pa
61.   while (p1 && p2) //p1和p2均非空
62.   {
63.     if (p1->expn == p2->expn) //指数相等
64.     {
65.       sum = p1->coef + p2->coef; //sum保存两项的系数和
66.       if (sum != 0) //系数和不为0
67.       {
68.         p1->coef=sum;//补充代码//修改Pa当前结点p1的系数值为两项系数的和
69.         p3->next = p1;
70.         p3 = p1; //将修改后的Pa当前结点p1链在p3之后,p3指向p1
71.         p1 = p1->next; //p1指向后一项
72.         r = p2;
73.         p2 = p2->next;
74.         delete r; //删除Pb当前结点r
75.       } else //系数和为0
76.       {
77.         r=p1;p1=p1->next;delete r;
78. 
79. //删除Pb当前结点p1
80.         r = p2;
81.         p2 = p2->next;
82.         delete r; //删除Pb当前结点p2
83.       }
84.     } else if (p1->expn < p2->expn) //Pa当前结点p1的指数值小
85.     {
86.       p3->next=p1;  //将p1链在p3之后
87.       p3=p1;     //p3指向p1
88.       p1=p1->next;     //p1指向后一项
89.     } else //Pa当前结点p2的指数值小
90.     {
91.       p3->next = p2; //将p2链在p3之后
92.       p3 = p2; //p3指向p2
93.       p2 = p2->next; //p2指向后一项
94.     }
95.   } //while
96.   p3->next = p1 ? p1 : p2; //插入非空多项式的剩余段
97.   delete Pb; //释放Pb的头结点
98. } //AddPolyn
99. 
100. 
101. int main() {
102.  Polynomial Pa, Pb;
103.  Polynomial p;
104.  int i;
105. 
106.  //创建多项式Pa
107.  CreatPolyn(Pa, temp); //调用函数,输入Pa每一项的系数和指数
108. 
109.  //创建多项式Pb
110.  CreatPolyn(Pb, temp); //调用函数,输入Pa每一项的系数和指数
111. 
112.  AddPolyn(Pa, Pb);
113.  cout << "多项式Pa和Pb相加后的结果是:\n";
114.  p = Pa->next;
115.  i = 0;
116.  while (p) //输出相加后的结果,每一项以x^n表示
117.  {
118.    if (i)
119.      cout << " + ";
120.    cout << "(" << p->coef << ") * x^" << p->expn;
121.    p = p->next;
122.    i = 1;
123.  }
124.  cout << endl;
125.  return 0;
126. }

程序运行需要创建两个文本文档PolyA和PolyB,例如:

目录
相关文章
|
29天前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
56 4
|
29天前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
44 4
|
29天前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
51 4
|
29天前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
40 4
|
29天前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
53 4
|
2月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
50 1
|
22天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
43 5
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
39 5
|
29天前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
80 4