单链表实练
来源:互联网 发布:软件测试具体工作 编辑:程序博客网 时间: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