关于链表的C语言实现(中级)

来源:互联网 发布:2012nba总决赛数据 编辑:程序博客网 时间:2024/06/05 00:13

多项式加减法(实验名称)
一、实验目的
掌握单链表应用:用链表表示多项式,并实现多项式的加减运算。

二、实验内容
设计一个一元稀疏多项式简单的加减法计算器,要求:
(1)和多项式仍然占用原来的结点空间,并输出和多项式。
(2)多项式按照指数递增的顺序输入,用户输入的多项式没有按照指数递增时,对多项式进行排序。
(3)核心的加法算法要考虑到加法的各种情况。

三、实验代码(包括运行结果截图)

1.  #include<stdio.h>  2.  #include<stdlib.h>  3.  #define MAXSIZE 200  4.    5.  struct Node  6.  {  7.      int exp;//指数  8.      int coe;//系数  9.      struct Node *Next;  10. };  11. typedef struct Node *LinkList;  12. typedef struct Node *PNode;  13.   14. /*初始化链表*/  15. LinkList initList()  16. {  17.     LinkList head = (LinkList)malloc(sizeof(struct Node));  18.     if (head == NULL)  19.     {  20.         printf("内存分配失败\n");  21.         return 0;  22.     }  23.     head->Next = NULL;  24.     return head;  25. }  26.   27. /*对输入数据进行插入排序处理*/  28. LinkList insertLinkList(LinkList head,PNode p)  29. {  30.     PNode q;  31.     LinkList pm;  32.     pm = (LinkList)malloc(sizeof(struct Node));  33.     pm = head;  34.     while (pm->Next != NULL)  35.     {  36.         if (pm->Next->exp > p->exp)//判断指数大小,根据指数顺序来  37.         {  38.             p->Next = pm->Next;  39.             pm->Next = p;//将最大的存入p  40.             return 1;  41.         }  42.         else if (pm->Next->exp == p->exp)  43.         {  44.             pm->Next->coe += p->coe;  45.             if (pm->coe == 0)  46.             {  47.                 q = pm->Next;  48.                 pm->Next = pm->Next->Next;  49.                 free(q);  50.             }  51.             free(p);  52.             return 1;  53.         }  54.         pm = pm->Next;  55.     }  56.     if (pm->Next == NULL)//当所有节点都比p小时  57.     {  58.         pm->Next = p;  59.         return 1;  60.     }  61. }  62.   63. /*输入数据并处理*/  64. LinkList createLinkList(LinkList head)//开始输入数据  65. {  66.     PNode p;  67.     int data_exp, data_coe;  68.     scanf_s("%d%d", &data_coe, &data_exp);  69.     p = head;  70.     while (data_coe != -1 || data_exp != -1)  71.     {  72.         p = (PNode)malloc(sizeof(struct Node));  73.         if (p == NULL)  74.         {  75.             printf("内存分配失败\n");  76.             return 0;  77.         }  78.         p->coe = data_coe;  79.         p->exp = data_exp;  80.         p->Next = NULL;  81.         insertLinkList(head,p);//对输入的节点进行排序处理  82.         scanf_s("%d%d", &data_coe, &data_exp);  83.     }  84.     return head;  85. }  86.   87. /*多项式相加*/  88. void addLinkList(LinkList l1,LinkList l2)  89. {  90.     PNode p,pr;  91.     PNode pa, pb;  92.     pr = l1;  93.     pa = l1->Next;  94.     pb = l2->Next;  95.     while (pa != NULL && pb != NULL)  96.     {  97.         if (pa->exp < pb->exp)  98.         {  99.             pr = pa;  100.                pa = pa->Next;  101.            }  102.            else if (pa->exp == pb->exp)  103.            {  104.                if (pa->coe + pb->coe == 0)//如果两者相加为0  105.                {  106.                    pr->Next = pa->Next;  107.                    p = pa;  108.                    free(p);  109.                }  110.                else  111.                {  112.                    pa->coe += pb->coe;  113.                    pr = pa;  114.                }  115.                pa = pr->Next;  116.                p = pb;  117.                pb = pb->Next;  118.                free(p);  119.            }  120.            else//如果要配入的主链表当前节点比l2大的话 将l2当前节点放置l1当前节点的前端并释放l2节点  121.            {  122.                p = pb->Next;  123.                pb->Next = pa;  124.                pr->Next = pb;  125.                pr = pb;  126.                pb = p;  127.            }  128.        }  129.        if(pb)  130.        {  131.            pr->Next = pb;  132.        }  133.    }  134.      135.    /*输出链表*/  136.    void printLinkList(LinkList head)  137.    {  138.        if (head->Next == NULL)  139.            printf("此链表为空!\n");  140.        else  141.            while (head->Next != NULL)  142.            {  143.                printf("%d %d\n", head->Next->coe, head->Next->exp);   144.                head = head->Next;  145.            }  146.    }  147.      148.    int main()  149.    {  150.        LinkList LA, LB;  151.        printf("输入多项式LA的系数和指数,以-1 -1结尾\n");  152.        LA = initList();  153.        createLinkList(LA);  154.        printf("此链表表示为\n");  155.        printLinkList(LA);  156.        printf("输入多项式LB的系数和指数,以-1 -1结尾\n");  157.        LB = initList();  158.        createLinkList(LB);  159.        printLinkList(LB);  160.        printf("两式相加结果为\n");  161.        addLinkList(LA, LB);  162.        printLinkList(LA);  163.        return 0;  164.    }  

这里写图片描述

原创粉丝点击