数据结构试验二:链表

第二次数据结构试验

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


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


/*
根据给出的一元多项式的加法写出一元多项式的乘法运算,要求用链表实现,
如果某一项的系数为零,提示重新输入,最终结果以横式输出.... 
*/
#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; 
}



继续在修正中完善!


你可能感兴趣的:(数据结构试验二:链表)