单链表实练

来源:互联网 发布:软件测试具体工作 编辑:程序博客网 时间:2024/05/04 20:55

本来以为大学里上的数据结构是非封闭逻辑的,没什么用的。。。实际上动手写一写完整的数据结构代码才发现自己的的无知2333.。。

这个是基于老师留的上机作业来写的,总体上主题是一元多项式的各种内容。

1.从键盘读入一元多项式中每一项的系数和指数,请编写算法实现:

建立带表头节点的单链表存放一元多项式(指数升序)

2.输出一元多项式的所有数据元素

3.将单链表存放的一元多项式就地逆置,变成指数降序排列

4.输入自变量的值计算一元多项式的值

5.求两个一元多项式的和多项式

附加题:3个递增有序的单链表A,B,C,在A表中删除同时出现在B和C中的数据元素

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct Node{int val;int exp;struct Node *next;}Node,*LinkList;LinkList aa,bb,sumh;LinkList fa,fb,fc;int cnt;int vaal[10000];int exxp[10000];void createList(LinkList &h)//常见的创建链表部分(带头节点h) {printf("输入创建多项式项数\n");LinkList f,p,k;int a,b,n;h=(LinkList)malloc(sizeof(Node));h->next=NULL;f=h;scanf("%d",&n);printf("依次输入各项的系数和指数\n");for(int i=1;i<=n;i++){scanf("%d %d",&a,&b);p=(LinkList)malloc(sizeof(Node));p->val=a;p->exp=b;p->next=NULL;f->next=p;f=p;}}void prt(LinkList L)//打印链表,征程遍历就可以 {printf("当前的多项式为:");LinkList p;p=L->next;while(p){if(p->next){if(p->val==1)printf("X^%d+",p->exp);elseprintf("%dX^%d+",p->val,p->exp);}else{if(p->val==1)printf("X^%d",p->exp);elseprintf("%dX^%d",p->val,p->exp);}p=p->next;}printf("\n");}void sort_up(LinkList L)//模仿数组来进行的选择排序,实际上就是交换了链表内数据元素的两个属性 {int temp;for(LinkList i=L->next;i;i=i->next){for(LinkList j=i;j;j=j->next){if(j->exp<i->exp){temp=i->val;i->val=j->val;j->val=temp;temp=i->exp;i->exp=j->exp;j->exp=temp;}}}}void reverse(LinkList head)//头插法将链表就地倒置  {    LinkList p,q;      p=head->next;      head->next=NULL;      while(p)      {          q=p;          p=p->next;          q->next=head->next;          head->next=q;      }  } void caluc(LinkList L)//遍历的时候把x带进去逐渐累加就行 {printf("请输入变量x的值");int x;LinkList p;int summ=0;int tt;scanf("%d",&x);p=L->next;while(p){tt=x;for(int i=1;i<p->exp;i++)tt=tt*tt;tt*=p->val;summ+=tt;p=p->next;}printf("%d\n",summ);}void AddList(LinkList List1, LinkList List2, LinkList &L)//两个链表相加,情况较复杂,自己走一走  {      LinkList p1,p2,list,s;      L = (LinkList)malloc(sizeof(Node));      L->next = NULL;      list = L;      p1 = List1->next;      p2 = List2->next;      while (p1 && p2)      {          if (p1->exp < p2->exp)          {              s = p1->next;              list->next = p1;              list = p1;              list->next = NULL;              p1 = s;          }          else if (p1->exp == p2->exp)          {              p1->val = p1->val + p2->val;              if (p1->val != 0)             {                  list->next = p1;                  s = p1->next;                  list = p1;                  list->next = NULL;                  p1 = s;                  p2 = p2->next;              }               else               {                  p1 = p1->next;                  p2 = p2->next;              }                        }          else          {              s = p2->next;              list->next = p2;              list = p2;              list->next = NULL;              p2 = s;          }      }      if(p1 != NULL) list->next = p1;      if(p2 != NULL) list->next = p2;  }void makad(){printf("请两次输入多项式\n");printf("第一个:\n");createList(aa);printf("第二个:\n");createList(bb);AddList(aa,bb,sumh);}void makag()//输入生成三个多项式,并且都按照升序排列 {printf("请三次输入多项式\n");printf("第一个\n");createList(fa);sort_up(fa); printf("第二个\n");createList(fb);sort_up(fb);printf("第三个\n");createList(fc);sort_up(fc);}void answ1(LinkList x,LinkList y)//将b c链表重复的元素保存在数组里 {LinkList p1,p2,q;cnt=0;p1=x->next;p2=y->next;q=p1;while(p1&&p2){if(p1->exp==p2->exp&&p1->val==p2->val){vaal[cnt]=p1->val;exxp[cnt++]=p1->exp;p1=p1->next;p2=p2->next; }else if(p1->exp==p2->exp&&p1->val!=p2->val){p1=p1->next;p2=p2->next;}else if(p1->exp<p2->exp)p1=p1->next;else if(p1->exp>p2->exp)p2=p2->next;}}void dele(LinkList A)//遍历链表,对于每一个数据元素遍历数组,看可不可以删掉 {LinkList ppp,qqq,tem;int point;int bl=1;qqq=A;ppp=A->next;while(ppp->next){bl=1;for(int i=0;i<cnt;i++){if(ppp->val==vaal[i]&&ppp->exp==exxp[i]){tem=ppp->next;qqq->next=tem;ppp=tem;bl=0;}}if(!bl)//如果没找到要删的,两个指针同时向后移一位,检查下一个数 {ppp=ppp->next;qqq=qqq->next;}}//下面这一串,其实就是检查最后一个节点要不要删(无法在正常过程删。。) //printf("---%d %d---\n",qqq->next->val,qqq->next->exp);for(int i=0;i<cnt;i++){if(ppp&&ppp->val==vaal[i]&&ppp->exp==exxp[i]){//qqq->next=NULL;//free(ppp);tem=qqq->next;qqq->next=NULL;free(tem);}}} void delans(){makag();answ1(fb,fc);dele(fa); /*for(int i=0;i<cnt;i++)printf("%d %d\n",vaal[i],exxp[i]);*///这个用来测试是不是把重复的数都记好了 }   int main(){int wkkk;LinkList hh,pp;printf("欢迎来到王者峡谷\n");printf("模块1:\n");printf("1.我要创建一元多项式\n"); printf("2.升序排一下下\n"); printf("3.输出看看\n"); printf("4.就地逆置\n"); printf("5.再输出看看\n"); printf("6.输入变量值计算\n"); printf("模块2:\n"); printf("7.两个一元多项式求下和\n"); printf("8.输出和\n"); printf("模块3\n"); printf("9.附加题\n"); printf("10.输出附加题结果\n"); printf("-----------------------------\n"); printf("PS:请按照顺序操作\n");ll: scanf("%d",&wkkk); switch(wkkk){ case 0:return 0; case 1:createList(hh); break; case 2:sort_up(hh); break; case 3:prt(hh); break; case 4:reverse(hh); break; case 5:prt(hh); break; case 6:caluc(hh); break; case 7:makad(); break; case 8:prt(sumh); break; case 9:delans(); break; case 10:prt(fa); break; } goto ll;}

运行结果分析:

文本菜单界面:


模块一功能测试:


模块2功能测试:


附加题功能测试:


编译环境:c-free5     编译

PS:本来我是要发图的,奈何不显示。。。同志们可以运行下代码就知道了2333

0 0
原创粉丝点击