顺序表练习

内容:

多项式相加:完成两个多项式的相加操作。要求使用链式存储结构实现

多项式相减:完成两个多项式的相减操作。要求使用链式存储结构实现以单链表示集合,假设集合A用单链表LA表示,集合B用单链表LB表示,设计算法求两个集合的差,既A-B。

算法分析:

多项式相加:利用以下的四个函数具体完成两个多项式的相加操作:

1.函数Init( )用来初始化一个空链表;

2.函数CreateFromTail()用来创建一个链表;

3.函数Polyadd()用来实现两个多项式相加算法;

4.函数Print()用来输出多项式。

两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针分别从多项式的首结点移动。

多项式相减:利用以下的四个函数具体完成两个多项式的相加操作:

1.函数Init( )用来初始化一个空链表;

2.函数CreateFromTail()用来创建一个链表;

3.函数Polysub()用来实现两个多项式相加算法;

4.函数Print()用来输出多项式。

两个多项式相减算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针分别从多项式的首结点移动。

集合的差A-B中包含所有属于集合A而不属于集合B的元素,对于集合A中的每个元素e,在集合B的链表LB上进行查找,若存在相同元素,则从LA中删除。

流程图:

多项式相加:

 多项式相减:

集合加减:

 代码如下:

多项式相加:

/*author:雷桂艺

time:2021年12月6日15:05

version:1.0

description:利用以下的四个函数具体完成两个多项式的相加操作:

1.函数Init( )用来初始化一个空链表;

2.函数CreateFromTail()用来创建一个链表;

3.函数Polyadd()用来实现两个多项式相加算法;

4.函数Print()用来输出多项式。

*/



#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedef struct poly {

       int exp;         //指数幂

       int coef;        //系数

       struct poly* next;      //指针域

}PNode, *PLinklist;

int Init(PLinklist* head)    //链表初始化

{

       *head = (PLinklist)malloc(sizeof(PNode));

       if (*head) {

              (*head)->next = NULL;

              return 1;

       }

       else

              return 0;

}

int CreateFormTail(PLinklist* head)      //尾插法创造链表

{

       PNode* pTemp, *pHead;

       int c;      //存放系数

       int exp;  //存放指数

       int i = 1; //计数器提示用户输入第几项

       pHead = *head;

       scanf_s("%d,%d", &c, &exp);

       while (c != 0) //系数为0表示结束输入

       {

              pTemp = (PLinklist)malloc(sizeof(PNode));

              if (pTemp)

              {

                     pTemp->exp = exp;    //接收指数

                     pTemp->coef = c; //接收系数

                     pTemp->next = NULL;

                     pHead->next = pTemp;

                     pHead = pTemp;

                     scanf_s("%d,%d", &c, &exp);

              }

              else

                     return 0;

       }

       return 1;

}

void Polyadd(PLinklist LA, PLinklist LB)  //两个多项式相加,该方法中两个表都是按指数顺序增长

{      //对指数进行对比分三类情况:A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中

       PNode* LA1 = LA->next;   //用于在LA中移动

       PNode* LB1 = LB->next;   //用于在LB中移动

       //*LA与*LB在充当LA1与LB1的前驱

       PNode* temp;     //保存要删除的节点

       int sum = 0;  //存放系数的和

       while (LA1 && LB1)

       {

              if (LA1->exp < LB1->exp)

              {

                     LA->next = LA1;   //LA的前结点可能是LB1或LA1

                     LA = LA->next;

                     LA1 = LA1->next;

              }

              else if (LA1->exp == LB1->exp) //指数相等系数相加

              {

                     sum = LA1->coef + LB1->coef;

                     if (sum)         //系数不为0,结果存入LA1中,同时删除LB1

                     {

                            LA->coef = sum;

                            LA->next = LA1;

                            LA = LA->next;

                            LA1 = LA1->next;

                            temp = LB1;

                            LB1 = LB1->next;

                            free(temp);

                     }

                     else     //系数为0的条件下删除两个结点

                     {

                            temp = LA1;

                            LA1 = LA1->next;

                            free(temp);

                            temp = LB1;

                            LB1 = LB1->next;

                            free(temp);

                     }

              }

              else

              {

                     LA->next = LB1;

                     LA = LA->next;

                     LB1 = LB1->next;

              }

       }

       if (LA1)          //将剩余结点链入链表

              LA->next = LA1;

       else

              LA->next = LB1;

}

void Print(PLinklist head)//输出多项式

{

       head = head->next;

       while (head)

       {

              if (head->exp)

                     printf("%dx^%d", head->coef, head->exp);

              else

                     printf("%d", head->coef);

              if (head->next)

                     printf("+");

              else

                     break;

              head = head->next;

       }

}

int main()

{

       PLinklist LA;  //多项式列表LA

       PLinklist LB;  //多项式列表LB

       Init(&LA);

       Init(&LB);

       printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");

       CreateFormTail(&LA);

       printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");

       CreateFormTail(&LB);

       Print(LA);

       printf("\n");

       Print(LB);

       printf("\n");

       Polyadd(LA, LB);

       printf("两个多项式相加的结果:\n");

       Print(LA);      //相加后结果保存到LA中,打印LA

       printf("\n");

}

多项式相减:

/*author:雷桂艺

time:2021年12月6日15:05

version:1.0

description:利用以下的四个函数具体完成两个多项式的相减操作:

1.函数Init( )用来初始化一个空链表;

2.函数CreateFromTail()用来创建一个链表;

3.函数Polysub()用来实现两个多项式相加算法;

4.函数Print()用来输出多项式。

*/

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedef struct poly {

       int exp;         //指数幂

       int coef;        //系数

       struct poly* next;      //指针域

}PNode, *PLinklist;

int Init(PLinklist* head)    //链表初始化

{

       *head = (PLinklist)malloc(sizeof(PNode));

       if (*head) {

              (*head)->next = NULL;

              return 1;

       }

       else

              return 0;

}

int CreateFormTail(PLinklist* head)      //尾插法创造链表

{

       PNode* pTemp, *pHead;

       int c;      //存放系数

       int exp;  //存放指数

       int i = 1; //计数器提示用户输入第几项

       pHead = *head;

       scanf_s("%d,%d", &c, &exp);

       while (c != 0) //系数为0表示结束输入

       {

              pTemp = (PLinklist)malloc(sizeof(PNode));

              if (pTemp)

              {

                     pTemp->exp = exp;    //接收指数

                     pTemp->coef = c; //接收系数

                     pTemp->next = NULL;

                     pHead->next = pTemp;

                     pHead = pTemp;

                     scanf_s("%d,%d", &c, &exp);

              }

              else

                     return 0;

       }

       return 1;

}

void Polysub(PLinklist LA, PLinklist LB)  //两个多项式相减,该方法中两个表都是按指数顺序增长

{      //对指数进行对比分三类情况:A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中

       PNode* LA1 = LA->next;   //用于在LA中移动

       PNode* LB1 = LB->next;   //用于在LB中移动

       //*LA与*LB在充当LA1与LB1的前驱

       PNode* temp;     //保存要删除的节点

       int differ = 0; //存放系数的差

       while (LA1 && LB1)

       {

              if (LA1->exp < LB1->exp)

              {

                     LA->next = LA1;   //LA的前结点可能是LB1或LA1

                     LA = LA->next;

                     LA1 = LA1->next;

              }

              else if (LA1->exp == LB1->exp) //指数相等系数相减

              {

                     differ = LA1->coef - LB1->coef;

                     if (differ)              //系数不为0,结果存入LA1中,同时删除LB1

                     {

                            LA->coef = differ;

                            LA->next = LA1;

                            LA = LA->next;

                            LA1 = LA1->next;

                            temp = LB1;

                            LB1 = LB1->next;

                            free(temp);

                     }

                     else     //系数为0的条件下删除两个结点

                     {

                            temp = LA1;

                            LA1 = LA1->next;

                            free(temp);

                            temp = LB1;

                            LB1 = LB1->next;

                            free(temp);

                     }

              }

              else

              {

                     LA->next = LB1;

                     LA = LA->next;

                     LB1 = LB1->next;

              }

       }

       if (LA1)          //将剩余结点链入链表

              LA->next = LA1;

       else

              LA->next = LB1;

}

void Print(PLinklist head)//输出多项式

{

       head = head->next;

       while (head)

       {

              if (head->exp)

                     printf("%dx^%d", head->coef, head->exp);

              else

                     printf("%d", head->coef);

              if (head->next)

                     printf("+");

              else

                     break;

              head = head->next;

       }

}

int main()

{

       PLinklist LA;  //多项式列表LA

       PLinklist LB;  //多项式列表LB

       Init(&LA);

       Init(&LB);

       printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");

       CreateFormTail(&LA);

       printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");

       CreateFormTail(&LB);

       Print(LA);

       printf("\n");

       Print(LB);

       printf("\n");

       Polysub(LA, LB);

       printf("两个多项式相减的结果:\n");

       Print(LA);      //相减后结果保存到LA中,打印LA

       printf("\n");

}

题目2-6:

/*author:雷桂艺

time:2021年12月6日11:45

version:1.0

description:由题意可知,集合的差A-B中包含所有属于集合A而不属于集合B的元素,对于集合A中的每个元素e,在集合B的链表LB上进行查找,若存在相同元素,则从LA中删除。

*/

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <time.h>



typedef int ElemType;

typedef struct node

{

       int data;//数据域 

       struct node *next;//指针域

} LNode, *LinkList;



//生成随机单链表:

void CreatListHead(LinkList *L, int n)

{

       LinkList p;

       int i;



       srand(time(0));

       *L = (LinkList)malloc(sizeof(node));

       (*L)->next = NULL;



       for (i = 0; i < n; i++)

       {

              p = (LinkList)malloc(sizeof(node));

              p->data = rand() % 20 + 1;

              p->next = (*L)->next;

              (*L)->next = p;

       }

}



void Difference(LinkList LA, LinkList LB)

//此算法求两个集合的差集

{

       LinkList pre, p, r,q;

       pre = LA; p = LA->next;//p指向LA表中的某一节点,而pre始终指向p的前驱

       while (p != NULL)

       {

              q = LB->next;

              while (q!= NULL&&q->data != p->data)

              {

                     q = q->next;

              }

              if (q != NULL)

              {

                     r = p;

                     pre->next = p->next;

                     p = p->next;

                     free(r);

              }

              else

              {

                     pre = p;

                     p = p->next;

              }

       }//while(p!=NULL)

}



//输出单链表

void Showlist(LinkList L)

{

       LinkList p;

       p = L->next;

       while (p != NULL)

       {

              printf("%d,", p->data);

              p = p->next;

       }

}



void main()

{

       LinkList LA;

       LinkList LB;

       CreatListHead(&LA, 15);

       CreatListHead(&LB, 10);

       printf("集合A的元素:\n");

       Showlist(LA);

       printf("\n");

       printf("集合B的元素:\n");

       Showlist(LB);

       printf("\n");

       printf("集合A-B的元素:\n");

       Difference(LA, LB);

       Showlist(LA);

       printf("\n");

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值