⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgfd.cpp

📁 这是数据结构书上的代码,我自己写的,就是厦门大学用的那本,不是什么高手,大家一起讨论哦
💻 CPP
字号:
# include<stdio.h>
# include<stdlib.h>
# define LEN sizeof (struct xiang)
struct xiang {
	int a;
	int nums;
	struct xiang * next;
};
int n,m;
struct xiang * creat(void)
{
	struct xiang *p1,*p2,*head;
	n=0;
	head=p1=p2=(struct xiang *)malloc(LEN);
	scanf("%d %d",&p1->a,&p1->nums);
	while(p1->a !=-1){
		p2=(struct xiang *)malloc(LEN);
		scanf("%d %d",&p2->a,&p2->nums);
		p1->next=p2;
		p1=p2;
		n++;
	}
	p1->next=NULL;
	return(head);
}

struct xiang * delet(struct xiang *head,struct xiang *p1)
{
	struct xiang *p2,*p3;
	if(head==NULL) {
		printf("can't find!");
		return (head);
	}
	p2=head;
	while(p2->a != p1->a && p2->nums != p1->nums){
		p3=p2;
		p2=p2->next;
	}
	if(p2->a==p1->a && p2->nums == p1->nums){
		if(p2==head) head=p2->next;
		else p3->next=p2->next;
	}
	else printf("error!");
     return(head);   
}
	
struct xiang *  range(struct xiang * head)
{
	struct xiang * p1,* p2,*p3,*p4,*head2;
	m=1;
	p3=p4=(struct xiang *)malloc(LEN);
	head2=NULL;
	while(n>0){
		p2=head;
		p1=p2->next;
		while(p1!=NULL){
			if(p2->nums < p1->nums){
				p2=p1;
				p1=p1->next;
			}
			else p1=p1->next;
		}
			if(m==1) head2=p3;
			p3->a=p2->a;
			p3->nums=p2->nums;
			p4=(struct xiang *)malloc(LEN);
			p3->next=p4;
			p3=p4;
			m++;
		    n--;
			head=delet(head,p2);
	}
	p3->next=NULL;
	return(head2);
	}

struct xiang * insert1(struct xiang *head,struct xiang *p)
{
	struct xiang *p0,*p1,*p2;
	p0=head;
	p1=p;
	if(head==NULL) {
		head=p1;
		p1->next=NULL;
	}
	else{
		while((p0->nums > p1->nums) && (p0->next !=NULL)){
			p2=p0;
			p0=p0->next ;
		}
		if(p0->nums == p1->nums){
			p0->a=p0->a + p1->a;
			if(p0->a==0){ 
				p2->next=p0->next;
				free(p0);
			}
		}
		else if(p0->nums < p1->nums ){
			if(head==p0){
				head=p1;
				p1->next=p0;
			}
			else{
				p2->next =p1;
				p1->next =p0;
			}
		}
		else{
			p0->next=p1;
			p1->next =NULL;
		}
	}
	return(head);
}
struct xiang * insert2(struct xiang *head,struct xiang *p)
{
	struct xiang *p0,*p1,*p2;
	p0=head;
	p1=p;
	if(head==NULL) {
		head=p1;
		p1->next=NULL;
	}
	else{
		while((p0->nums > p1->nums) && (p0->next !=NULL)){
			p2=p0;
			p0=p0->next ;
		}
		if(p0->nums == p1->nums){
			p0->a=p0->a - p1->a;
		    if(p0->a==0){
				p2->next=p0->next;
		        free(p0);
			}
		}
		else if(p0->nums < p1->nums ){
			if(head==p0){
				head=p1;
				p1->next=p0;
			}
			else{
				p2->next =p1;
				p1->next =p0;
			}
		}
		else{
			p0->next=p1;
			p1->next =NULL;
		}
	}
	return(head);
}
int jisun(int a,int nums,int x)
{
	int y,sum=1,i;
    for(i=0;i<=nums;i++)
		sum=sum * x;
	y=sum * a;
	return y;
}

int main()
{
	struct xiang *head1,*head2,*head3,*head4,*p1,*p2,*p;
	int x=0,c,y=0,a=0,b,f,ss,as=0;
	printf("请输入多项式,输入“-1 -1”结束多项式的输入\n");
	printf("系数      次方\n");
	head3=creat();
	head1=range(head3);
	p1=head1;
    printf("多项式1:\n");
	printf("系数      次方\n");
	while(p1->next !=NULL){
		printf("%-10d%-50d\n",p1->a,p1->nums );
		x++;
		p1=p1->next ;
	}
	printf("多项式1共有%d项\n",x);
	printf("可以选择下列选项,进行多项式的运算:\n");
	printf("1.计算多项式在x处的值,请按Y,否则,请按任意其他字母键\n");
    printf("2.进行多项式的相加或相减\n");
	printf("3.退出\n");
	while(c !=3){
	scanf("%d",&c);
	if(c==1){
         printf("请输入x的值:\n");
 	     scanf("%d",&f);
		 p1=head1;
	     while(p1->next !=NULL){
		     ss=jisun(p1->a,p1->nums,f);
		     as=as+ss;
			 p1=p1->next;
		 }
	     printf("多项式在处的值是%d\n",as);
	}
	else if(c==2){
	    printf("系数     次方\n");
	    head4=creat();
	    head2=range(head4);
	    p2=head2;
	    printf("多项式2:\n");
	    printf("系数     次方\n");
	    while(p2->next !=NULL){
		    printf("%-10d%-50d\n",p2->a,p2->nums);
		    y++;
		    p2=p2->next ;
		}
	    printf("多项式2共有%d项\n",y);
	    p2=head2;
	    p=p2->next ;
	    printf("如果想将两多项式相加按0;\n如果想将两多项式相减按1\n");
     	scanf("%d",&b);
	    if(b==0){
			while(p2->next !=NULL){
		        head1=insert1(head1,p2);
		        p2=p ;
		        p=p->next;
			}
	        p1=head1;
	        printf("两多项式的和为:\n");
	        printf("系数    次方\n");
	        while(p1->next !=NULL){
		        printf("%-10d%-50d\n",p1->a,p1->nums);
		        a++;
		        p1=p1->next ;
			}
	        printf("此多项式共有%d项\n",a);
		}
	    if(b==1){
		    while(p2->next !=NULL){
		        head1=insert2(head1,p2);
		        p2=p ;
				p=p->next;
			}
	        p1=head1;
	        printf("两多项式的和为\n:");
	        printf("系数    次方\n");
	        while(p1->next !=NULL){
		        printf("%-10d%-50d\n",p1->a,p1->nums);
		        a++;
		        p1=p1->next ;
			}
	        printf("此多项式共有%d项\n",a);
		}
	}
    printf("可以选择下列选项,进行多项式的运算:\n");
	printf("1.计算多项式在x处的值,请按Y,否则,请按任意其他字母键\n");
    printf("2.进行多项式的相加或相减\n");
	printf("3.退出\n");
	}
     return 0;
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -