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

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

二、实验内容
设计一个一元稀疏多项式简单的加减法计算器,要求:
(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.    }  

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Around_corner/article/details/78508660