您的位置:首页 > 理论基础 > 数据结构算法

数据结构试验二:链表

2015-10-13 06:13 519 查看
第二次数据结构试验

老师给出的程序比较齐全,直接进行稍微修改就可以实现相乘了,仅仅是个双循环而已,其他地方基本没有难点了,主要是链表的操作,自己做的比较粗糙,不过暂时功能考虑的还算可以.....

今天早上一点多完善的,但是想提交的时候,电脑没电自动关机了......然后到现在提交了.......

/*
根据给出的一元多项式的加法写出一元多项式的乘法运算,要求用链表实现,
如果某一项的系数为零,提示重新输入,最终结果以横式输出....
*/
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define null 0//表示为空
typedef struct//定义结构体表达每一项的数据
{
float coef;//系数
int expn;//指数
}term;

typedef struct Lnode//定义链表
{
term data;
Lnode *next;
}*Link,*Linklist;

int cmp(term a,term b)//自定义比较函数
{
if (a.expn==b.expn)//指数相同的才算相同
{
return 0;
}
else
{
return (a.expn-b.expn)/abs(a.expn-b.expn);
//返回大小顺序,因为可能有负值,所以这样操作
}
}
void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//顺序插入
{
Link o,p,q;
q=L;
p=q->next;
while (p&&comp(p->data,e)<0)//循环查找位置
{
q=p;p=p->next;
}
o=(Link)malloc(sizeof(Lnode));
o->data=e;//赋值
q->next=o;o->next=p;//生成连接链表
}
int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))
//查找链表中是否有某一项
{
Link p;s=L;
p=s->next;
while (p&&comp(p->data,e)!=0)//循环查找
{
s=p;p=p->next;
}
if(!p)//未查找到,证明这一项不存在
{
s=q=null;
return 0;
}
else //查找到
{
q=p;
return 1;
}
}
void Delnext(Linklist &L,Link s)//删除
{
Link q=s->next;
s->next=q->next;
free(q);//释放空间
}
void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term))
//顺序插入合并函数
{
Link q,s;
if(LocateElem(L,e,s,q,compara))//当前指数的项已经在链表中存在
{
q->data.coef+=e.coef;//计算徐虎
if (!q->data.coef)//系数为零
{
Delnext(L,s);//删除这一项
}
}
else//否则
{
Orderinsert(L,e,compara);//顺序插入到相应的位置
}
}

void Creatpolyn (Linklist &p,int m)//创建链表
{
term e;int i;
p=(Link)malloc(sizeof(Lnode));//创建头结点
p->next=null;//只有一个头结点
//printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
for(int i=0;i<m;)
{
printf("\n请输入第%d项的系数和指数,以换行为结束:\n",i+1);
scanf("%f%d",&e.coef,&e.expn);
if(e.coef==0)
{
printf("输入错误,请重新输入该项数据!\n");
}
else
{
Orderinsertmerge(p,e,cmp);//顺序插入合并
++i;
}
}
}

void add(Linklist La,Linklist Lb,Linklist &Lc) //链表相加
{
Lc=(Link)malloc(sizeof(Lnode));//给链表Lc 一个头结点
Lc->next=null;//只有一个头结点
term tp;
for(Link q=La->next;q;q=q->next)//顺序插入 a 表的每一个元素
{
tp=q->data;
Orderinsertmerge(Lc,tp,cmp);
}
for(Link q=Lb->next;q;q=q->next)//顺序插入 b 表的每一个元素
{
tp=q->data;
Orderinsertmerge(Lc,tp,cmp);
}
}

void mul(Linklist La,Linklist Lb,Linklist &Lc) //链表相乘
{
Link qa,qb,qc;
Lc=(Link)malloc(sizeof(Lnode));//给链表Lc 一个头结点
Lc->next=null;//只有一个头结点
qa=La->next;qb=Lb->next;
for(qa=La->next;qa;qa=qa->next)//双循环遍历二项式相乘的所有的情况
{
term a=qa->data;
for(qb=Lb->next;qb;qb=qb->next)
{
term b=qb->data;//分别取出两项
term tp={a.coef*b.coef,a.expn+b.expn};//求出当前项的资料
Orderinsertmerge(Lc,tp,cmp);//顺序插入合并
}
}
}
void printpolyn(Linklist p)//横式输出,需要考虑的多了点
{
int kase=0;//标记链表是否为空
//printf("\t系数\t指数\n");
for(Link q=p->next;q;q=q->next)
{
term tp=q->data;
if(kase&&tp.coef>0)//不是第一项,而且系数为正,输出 +
{
printf("+");
}
//控制输出系数
if(tp.coef==-1)//系数为-1
{
printf("-");//肯定输出一个负号
if(tp.expn==0)//指数为零的话
{
printf("1");
}
}
else if(tp.coef==1&&tp.expn==0)//系数为1 指数为0
{
printf("1");
}
else if(tp.coef!=1)//其他系数只要不等于1,就正常输出系数
{
printf("%g",tp.coef);
}

if(tp.expn!=0)//指数为零的不输出 X
{
printf("X");
if(tp.expn!=1)//指数不等于1 正常输出
{
printf("^%d",tp.expn);
}
}
kase=1;
}
printf("\n\n");
if(!kase)
{
printf("0(该多项式为零)\n");
}
}

void slove(Linklist L1,Linklist L2,Linklist L3,Linklist L4)//实现功能
{
printf("请选择需要实现的功能:\n\t1:多项式相加\n\t2:多项式相乘\n\t3:退出功能选择\n");
int chose;
scanf("%d",&chose);
if(chose==1)
{
add(L1,L2,L3);
printf("\n相加以后的一元多项式为(变量用X代替):\n");
printpolyn(L3);
slove(L1,L2,L3,L4);
}
else if(chose==2)
{
mul(L1,L2,L4);
printf("\n相乘以后的一元多项式为(变量用X代替):\n");
printpolyn(L4);
slove(L1,L2,L3,L4);
}
else if(chose==3)
{
return;
}
else
{
printf("输入错误,请重新操作!\n");
slove(L1,L2,L3,L4);
}
}

int main()
{
int x,kase=1;
//freopen("shuju.txt","r",stdin);
while(kase==1)
{
Linklist L1,L2,L3,L4;
printf("\n\t\t\t欢迎使用本程序进行一元多项式的运算\t\t\t\n");
//printf("请选择:\n \t1:进行一元多项式的运算\n\tq");
printf("\t请输入第一个一元多项式的项数:\n");
scanf("%d",&x);
Creatpolyn(L1,x);
printf("\t第一个一元多项式为:\n");
printpolyn(L1);

printf("\t请输入第二个一元多项式的项数:\n");
scanf("%d",&x);
Creatpolyn(L2,x);
printf("\t第二个一元多项式为:\n");
printpolyn(L2);

slove(L1,L2,L3,L4);
printf("请选择操作:\n\t1:多项式运算\n\t其他:退出程序!\n");
scanf("%d",&kase);
if(kase==1)
{
system("cls");
}
}
printf("\t谢谢使用!\n");
return 0;
}

继续在修正中完善!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: