当前位置: 代码迷 >> C语言 >> [原创]单链表实现多项式相加
  详细解决方案

[原创]单链表实现多项式相加

热度:628   发布时间:2004-08-29 19:56:00.0
[原创]单链表实现多项式相加

#include<iostream.h>

typedef int ElemType;

struct Pnomial //Pnomial=Polynomial(多项式) { ElemType co,de; //co=coefficient(系数), de=degree(次数)

Pnomial* next; };

void main() { Pnomial *ph,*p,*q; //ph表头指针,p移动指针,q临时储存结点

ph=p=new Pnomial;

cout<<"\nthe 1st Polynomial:"<<endl; cout<<"give coefficient value:"<<endl;

while(p->co!=0) { q=new Pnomial;

cin>>q->co; if(q->co!=0) { cout<<"x^"; cin>>q->de; cout<<"+"; }

p->next=q; p=q; }

q->de=886; //一个链表储存两个多项式,以X的886次方为界

cout<<"the 1st Polynomial end."<<endl; cout<<"\nthe 2nd Polynomial:"<<endl; cout<<"give coefficient value:"<<endl;

do { q=new Pnomial;

cin>>q->co; if(q->co!=0) { cout<<"x^"; cin>>q->de; cout<<"+"; }

p->next=q; p=q; } while(p->co!=0);

cout<<"the 2nd Polynomial end."<<endl;

p->next=NULL; p=ph->next;

cout<<'\n'<<endl; cout<<"the 1st Polynomial:"<<endl;

while(p->next!=NULL) { if(p->de==886) { cout<<'\n'<<endl; cout<<"the 2nd Polynomial:"<<endl; p=p->next; } else if(p!=ph->next) cout<<" + ";

if(p->co!=1) cout<<p->co;

if(p->de!=0) { cout<<"x"; if(p->de!=1) cout<<"^"<<p->de; }

p=p->next; } cout<<'\n'<<endl;

//以上代码实现输入和打印

//以下代码实现系数相加并打印结果

p=ph->next; Pnomial *re,*di,*temp; //新建一个链表储存结果 //re=result(结果), di=displace(移动指针)

Pnomial *ap; //删除链内结点时临时存放指针位置的链外结点

ap=NULL;

int counter=0; //计数变量,记录p赋值给temp的起始结点

re=di=new Pnomial;

while(p->next!=NULL) { temp=new Pnomial; temp->co=p->co; temp->de=p->de;

while(p->next!=NULL) { ap=p; //暂时存放前一个结点的指针地址

p=p->next; //当前待处理结点

if(p->de==886) continue;

if(p->de==temp->de) { temp->co=temp->co+p->co; //次数一样则加进temp->co

//实际上就是删除加了进去temp->co的结点 if(p==NULL) ap->next=p; //NULL时不用跳过 else ap->next=p->next; //跳过p指向p->next p=ap; //把地址还给p指针 } }

di->next=temp; di=temp;

p=ph->next; //p指针每处理完一次都先返回到表头结点

counter++; for(int i=0;i<counter;i++) p=p->next;

if(p->de==886) { p=p->next; counter++; } }

di->next=NULL;

cout<<"the result Polynomial:"<<endl;

di=re->next; //di回到表头结点,准备打印结果多项式

while(di!=NULL) { if(di!=re->next) cout<<" + ";

if(di->co!=1) cout<<di->co;

if(di->de!=0) { cout<<"x"; if(di->de!=1) cout<<"^"<<di->de; }

di=di->next; }

cout<<'\n'<<endl; }

[此贴子已经被作者于2004-08-29 20:02:00编辑过]

搜索更多相关的解决方案: 多项式  单链  相加  

----------------解决方案--------------------------------------------------------

不是故意发的,是我发贴发错地方又删除不了,所以用我的小作编辑过来,也算是原创。


----------------解决方案--------------------------------------------------------
你刚才发的是什么?   如果不是原创也可以贴到c语言教室让大家学习嘛```
----------------解决方案--------------------------------------------------------

给你出道题吧:

试设计一个实现下述要求的查找运算函数Locate。设有一个带表头结点的双向链表L, 每个结点有4个数据成员:指向前驱结点的指针llink、指向后继结点的指针rlink,存放字符数据的成员data和访问频度freq。所有结点的freq 初始时都为0。每当在链表上进行一次Locate(L, x) 操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

这个题网上可能能搜到答案 但是我还是希望能看到你的原创``


----------------解决方案--------------------------------------------------------
机器人大战源代码

原来要发这个:

#include "graphics.h" #include "bios.h" #include "conio.h" #include "stdlib.h" #include "dos.h"

#define UP 0x4800 #define DOWN 0x5000 #define LEFT 0x4600 #define RIGHT 0x4d00 #define ESC 0x0016

#define VGA256 0x13 #define TEXT 0x03

int x,y,l,sxzy=0,zx=0,xx=5,yy=167; int x1=5,y1=3,x3=0,y3=0,x4=0,y4=0; int youlife=50,mylife=30; int board[100][170];

unsigned char far *video_buff=(char far *)0xA0000000L;

void setvideomode(int mode) { union REGS inregs,outregs; inregs.h.ah=0; inregs.h.al=(unsigned char)mode; int86(0x10,&inregs,&outregs); }

void v_line(int y0,int y1,int x,unsigned int color) { unsigned int address,n,temp; address=320*y0+x; for(n=0;n<=y1-y0;n++) { if(y0>y1) { temp=y1; y1=y0; y0=temp; } video_buff[address]=color; address+=320; } }

void h_line(int x0,int x1,int y,unsigned int color) { unsigned int address,n,temp; address=320*y+x0; for(n=0;n<=x1-x0;n++) { if(x0>x1) { temp=x1; x1=x0; x0=temp; } video_buff[address]=color; address+=1; } }

void p_pixel(int x,int y,unsigned int color) { video_buff[y*320+x]=color; }

void s_square(int x,int y,int side,int color) { h_line(x,x+side,y,color); h_line(x,x+side,y+side,color); v_line(y,y+side,x,color); v_line(y,y+side,x+side,color); }

void r_rectangle(int x1,int y1,int x2,int y2,int color) { h_line(x1,x2,y1,color); h_line(x1,x2,y2,color); v_line(y1,y2,x1,color); v_line(y1,y2,x2,color);

}

void fillRectangle(int x1,int y1,int x2,int y2,int color) { int i; for(i=y1;i<=y2;i++) { h_line(x1,x2,i,color); } }

void ground() /*画外框*/ { r_rectangle(104,20,207,190,7); }

void delzx() /*每次出拳后,删除拳头*/ { delay(1000); s_square(x3,y3,5,0); s_square(x3,y3-6,5,0); x3=0; y3=0; }

void me() /*画出自己*/ { int cas=0; if(sxzy==18432) /*如果按上键,就往上移动*/ { yy-=5; if(yy < y1+30) yy+=5; if(yy==12) yy=17; } if(sxzy==20480) /*如果按下键,就往下移动*/ { yy+=5; if(yy==172) yy=167; } if(sxzy==19200) /*如果按左键,就往左移动*/ { xx--; if(xx==-1) xx=0; } if(sxzy==19712) /*如果按右键,就往右移动*/ { xx++; if(xx==13) xx=12; } sxzy=0; for(x=xx;x<5+xx;x++) /*给自己搭建骨架*/ { if(x==xx) /*左手*/ { y=167; board[x][yy]=1; if(zx==11386) { board[x][yy-12]=3; board[x][yy-11]=3; if((yy-11 < y1+30) && (xx>=x1 && xx<=x1+4)) youlife--; cas=1; zx=0; } x++; } if(x==xx+4) /*右手*/ { y=167; board[x][yy]=1; if(zx==11640) { board[x][yy-12]=3; board[x][yy-11]=3; if((yy-11 < y1+30) && (xx+4<=x1+4 && xx+4>=x1)) youlife--; cas=2; zx=0; } break; } for(y=yy;y<yy+3;y++) /*身体*/ { board[x][y]=1;

} } for(x=0;x<100;x++) /*开始往骨架上放‘肉’*/ {l=1; for(y=0;y<170;y++) if(board[x][y]==1 || board[x][y]==3) {if(cas==1) { board[x][yy-10]=1; board[x][yy]=0; cas=0; } if(cas==2) { board[x+4][yy-10]=1; board[x+4][yy]=0; cas=0; } if(board[x][y]==3) { x3=x+105+x*5; y3=y+l*5;

} s_square(x+105+x*5,y+l*5,5,3); l++; } } delzx(); }

void zyou() /*搭建设对方骨架*/ { int ran,cas=0,p=0; delay(10000); for(x=99;x>=0;x--) { l=1; for(y=169;y>=0;y--) if(board[x][y]==2 || board[x][y]==4) { s_square(x+105+x*5,35+y-l*5,5,0); l++; board[x][y]=0; } }

ran=random(5); if(ran==0) /*往上走*/ { y1-=5; if(y1==-2) y1=3; } if(ran==1) { y1+=5; if(y1+30 > yy) /*不允许超过我的机器人的身后*/ y1-=5; if(y1==158) /*往下走,如果超过外框,就减去一步,实际上是永远也不会超过*/ y1=153; } if(ran==2) /*往左走*/ { x1--; if(x1==-1) x1=0; } if(ran==3) /*往右走*/ { x1++; if(x1==13) x1=12; } if(ran==4) { y1+=5; if(y1+30 > yy) /*不允许超过我的机器人的身后*/ y1-=5; if(y1==158) /*往下走,如果超过外框,就减去一步,实际上是永远也不会超过*/ y1=153; } for(x=x1;x<x1+5;x++) /*对方拳头*/ { if(x==x1) { if((y1+45 >= yy) && x>=xx) /*判断敌人是否靠近,如果是就出拳头*/ { p=random(2); if(p==1) { board[x][y1+15]=4; board[x][y1+16]=4; board[x][y1+17]=4; if((yy-11 < y1+30) && (xx+4<=x1+4 && xx+4>=x1)) mylife--; cas=1; } p=0; } if(cas==1) { board[x][y1+14]=2; cas=0; } else board[x][y1]=2; x++; } if(x==x1+4) { if((y1+45 >= yy) && x<=xx+4) { p=random(2); if(p==1) { board[x][y1+15]=4; board[x][y1+16]=4; board[x][y1+17]=4; if((yy-11 < y1+30) && (xx>=x1 && xx<=x1+4)) mylife--; cas=1; } p=0; } if(cas==1) { board[x][y1+14]=2; cas=0; } else board[x][y1]=2; break; } for(y=y1;y+3>y1;y--) { board[x][y]=2; } } }

void delt() /*删除对方拳头*/ { delay(1000); s_square(x4,y4+12,5,0); s_square(x4,y4+6,5,0); s_square(x4,y4,5,0); x4=0; y4=0; }

void you() /*画出对方*/ {

int key=0;

while(key!=283 && youlife>0 && mylife>0) { fillRectangle(250+youlife,50,300,53,0); fillRectangle(250+mylife,150,280,153,0); while(bioskey(1)==0) { zyou(); for(x=99;x>=0;x--) { l=1; for(y=169;y>=0;y--) if(board[x][y]==2 || board[x][y]==4) { s_square(x+105+x*5,35+y-l*5,5,3); if(board[x][y]==4) { x4=x+105+x*5; y4=35+y-l*5; } l++;

} } delt(); } key=bioskey(0);

if(key==18432 || key==20480 || key==19200 || key==19712 || key==11386 || key==11640) { if(key==11386 || key==11640) /*按键的判断*/ zx=key; else sxzy=key; key=0; for(x=0;x<100;x++) { l=1; for(y=0;y<170;y++) if(board[x][y]==1 || board[x][y]==3) { s_square(x+105+x*5,y+l*5,5,0); l++; board[x][y]=0; /*getch();*/ } } me(); }

}

}

main() { int x=0,y,i=1,key,c=0,p,k=0,e=1; int gdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,"d:\\tc"); setbkcolor(BLACK); setcolor(WHITE); settextstyle(0,0,4); outtextxy(100,20,"TIAN YU SOFT"); setcolor(GREEN); outtextxy(101,20,"TIAN YU SOFT"); settextstyle(1,0,1); outtextxy(70,60,"This game is TianYu designed,maybe this game not good,"); outtextxy(50,80,"but the game is my second game programe.Welcome play my"); outtextxy(50,100,"game,and make friend."); outtextxy(301,250,"Emainmicrozhujie@citiz.net"); outtextxy(301,300,"http://angel24.51.net";;);

getch(); cleardevice(); setcolor(RED); while(i) { settextstyle(1,0,5); setwritemode(XOR_PUT); outtextxy(x,200,"X man"); delay(1000); outtextxy(x,200,"X man"); x+=2; if(x>200) i=0;

} outtextxy(x,200,"X man"); while(!kbhit()) { setcolor(c); outtextxy(x,200,"X man"); c++; if(c>16) c=0; } settextstyle(0,0,1); setcolor(GREEN); outtextxy(300,300,"right->x left->z"); outtextxy(300,330,"please press 's' and start"); while(e) { k=bioskey(0); if(k==8051) e=0; }

board[99][169]=4;

closegraph(); setvideomode(VGA256); ground(); fillRectangle(250,50,250+youlife,53,4); fillRectangle(250,150,250+mylife,153,4); me(); you(); initgraph(&gdriver,&gmode,"d:\\tc"); if(youlife==0) { setcolor(WHITE); settextstyle(0,0,4); outtextxy(100,20,"You Win"); setcolor(GREEN); outtextxy(101,20,"You Win"); settextstyle(0,0,4); setcolor(WHITE); outtextxy(100,120,"TIAN YU SOFT"); setcolor(RED); outtextxy(101,120,"TIAN YU SOFT"); outtextxy(301,300,"2002/10/11"); getch(); getch(); getch(); } else if(mylife==0) { setcolor(WHITE); settextstyle(0,0,4); outtextxy(100,20,"You Lost"); setcolor(GREEN); outtextxy(101,20,"You Lost"); settextstyle(0,0,4); setcolor(WHITE); outtextxy(100,120,"TIAN YU SOFT"); setcolor(RED); outtextxy(101,120,"TIAN YU SOFT"); outtextxy(301,300,"2002/10/11"); getch(); getch(); getch(); } else { settextstyle(0,0,4); setcolor(WHITE); outtextxy(100,120,"TIAN YU SOFT"); setcolor(RED); outtextxy(101,120,"TIAN YU SOFT"); outtextxy(301,300,"2002/10/11"); } getch(); closegraph(); setvideomode(TEXT); }

不过是别人的原创……


----------------解决方案--------------------------------------------------------
以下是引用忆楠在2004-08-29 20:30:01的发言:

给你出道题吧:

试设计一个实现下述要求的查找运算函数Locate。设有一个带表头结点的双向链表L, 每个结点有4个数据成员:指向前驱结点的指针llink、指向后继结点的指针rlink,存放字符数据的成员data和访问频度freq。所有结点的freq 初始时都为0。每当在链表上进行一次Locate(L, x) 操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

这个题网上可能能搜到答案 但是我还是希望能看到你的原创``

我晕~~~开学了,可能我很久才会再上网,今晚是最后一晚了……我试试看吧~~~


----------------解决方案--------------------------------------------------------
  呵呵  你开学了   那就算了吧  以后用空在做   不要耽误了学习````
----------------解决方案--------------------------------------------------------
没有的,老妈不让住宿,惟有走读,又可以上来了~~~
----------------解决方案--------------------------------------------------------

谢谢了
拿去给老师看
过了就爽


----------------解决方案--------------------------------------------------------
说不定楼主就是你的老师
----------------解决方案--------------------------------------------------------
  相关解决方案