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


    一、 实验目的

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

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

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

    二、 实验要求

    1、演示程序运行结果

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

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

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

    三、实验内容

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

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

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

    (3) 输出求和结果。

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

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

     

     

  • 相关阅读:
    KaiwuDB 助力能源企业实现 4 大价值提升
    基于ITIL的ITSM工具
    一张图进阶 RocketMQ - 通信机制
    浅析建筑电气火灾问题和预防方案
    STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
    Roam Research 综合评测以及使用教程
    Android AMS ATMS
    Java之IO流02
    【笔记】大话设计模式14-观察者模式
    迎难而上,做云原生时代的弄潮儿:搞定 Kubernetes
  • 原文地址:https://blog.csdn.net/qq_64314976/article/details/126214439