首页 > 代码库 > 数据结构算法总结
数据结构算法总结
//链表基本操作tatus ListOppose(LinkList &L) { linklist p,q; p=L; p=p->next; L->next=NULL; while(p){ q=p; p=p->next; q->next=L->next; L->next=q; } return OK; } //两个有序链表合并成一个 void MergeList(LinkList &la,LinkList &lb) { LinkList pa,pb,pc; pc=la; pa=la->next;pb=la->next; while(pa&&pb) { if(pa->num<pb->num) {pc->next=pa;pc=pa;pa=pa->next;} else {pc->next=pb;pc=pb;pb=pb->next;} } if(pa) pc->next=pa; if(pb) pc->next=pb; } //删去la中与lb相同的元素 Status DelSame(LinkList &la,LinkList &lb ) { LinkList p,q,r; p=la;q=p->next; while(q!=NULL) { r=lb->next; while(r!=NULL&&r->num!=q->num) r=r->next; if(r==NULL) p=q; else p->next=q->next; q=q->next; } } /*栈和队列常见算法*/ //进制转换 void Conersion(int n) { Initstack(S); while(n) { push(S,n%N); n/=N; } /*十六进制 while(n){ if(n%16<=9) push(S,n%16+48);//存入字符 else push(S,n%16+55) 此时存入的是字符 } */ while(!emptystack) { pop(S,e); printf("%d",e); } } //行编辑程序,存入文件 void LineEdit(){ FILE *fp=fopen("file.txt","w"); InitStack(S); ch=getchar(); while(ch!=EOF){ while(ch!=EOF&&ch!='\n') {//全文未结束且未到行末 switch(ch) { case '#':pop(S,c);break; case '@':clearstack(S);break; default:push(S,ch) ;break; } ch=getchar(); } StackTraverse(S,copy);//遇到'\n'或者EOF从栈底到栈顶的栈内字符传送至文件 fputc('\n',fp);//向文件传送一个换行符 clearstack(S); if(ch!=EOF) ch=getchar(); } destroystack(S); fclose(fp); } //迷宫问题 typedef struct{ int x; int y; }PosType;//迷宫坐标位置类型 typedef struct{ int ord; //通道块在路径上的序号 PosType seat;//通道块在迷宫中的坐标 int di;//走向下一个通道快的方向 }SElemType; Mazetype m;//迷宫数组 void Print();//输出迷宫的解 void Init(int k)//迷宫数组的初始化,墙值为0,通道值为k Status Pass(PosType b);//当迷宫m的b点序号为1(可以通过),返回OK,否则,返回error void FootPrint(Postype a)//a点变为足迹 PosType Nextpos(PosType&c,int di)//根据当前位置及移动方向,求下一位置 void Markprint(PosType b)//使b点序号变为-1(不能通过) Status MazePath(PosType start,PosType end)//算法 { InitStack(S); curpos=start; curstep=1; SElemType e; do{ if(Pass(curpos)){//当前位置可以通过 FootPrint(curpos);//留下足迹 e.ord=curstep;e.seat=curpos;e.di=0; push(S,e);//加入路径 ++curstep; if(curpos==end) return true; curpos=Nextpos(curpos,e.di); } else //当前位置不能通过 { if(!Stackempty(S)) { pop(S,e);//退栈到前一位置 curstep--;//足迹减一 while(e.di==3&&!Stackempty(S))//前一位置处于最后一个方向 { markPrint(e.seat);//留下不能通过的标记(-1) pop(S,e);//继续回退 curstep--; } if(e.di<3) { e.di++; push(S,e);//push e into stack again curstep++; curpos=e.seat;//确定当前位置 curpos=NeatPos(curpos,e.di); } } }while(!Stackempty(S)); return FALSE; } } //表达式求值 char Precede(SElemType t1,SElemtype t2)//判断t1,t2量符号的优先关系 Status In(Selemtype c)//判断c是否7种运算符之一 SElemType Operate(SElemType a,SElemType theta,SElemtype b) //做四则运算:a theta b,返回运算结果 SElemtype EvaluateExpression()//算法 { Initstack(OPTR);push(OPTR,'#'); Initstack(OPND); c=getchar(); while(c!='#'||Gettop(OPTR)!='#') { if(!In(c)) push(OPND,c);//不是运算符则进栈 else switch(Precede(Gettop(OPTR),c)){ case '<':push(OPTR,c);c=getcahr();//栈顶元素优先权低 break; case '=':pop(OPTR,x);c=getchar();//脱括号,接受下一个字符 break; case '>':pop(OPTR,thea);// 退栈并将运算结果入栈 pop(OPND,a);pop(OPND,b); push(OPND,Operate(a,theta,b)); break; }//switch c=getchar(); }//while return Gettop(OPND); } //八皇后问题 typedef struct{ int i; int j; }Pos; Pos pos[3]={{-1,-1},{-1,1},{-1,0}}//检测左上,右上,上,三个方向 void queenini(void)//初始化 void display(void)//打印出来 int check(int i,int j)//检测board[i][j]是否能放皇后,返回1,可放 { int ni,nj,k,t; t=1; for(k=0;k<3;k++) { ni=i;nj=j; while(t&&board[ni][nj]!='#')//未到达边界且未检测到皇后 { ni+=pos[k].i;nj+=pos[k].j; if(board[ni][nj]=='*') t=0//t=0表示遇到皇后,退出while, } } return t; } void queenfind(int i,int j) {//递归两个出口:1.i>N 2.回溯,重置board[i][k]=' ' int k; if(i>N) {count++;display();} else//j not used,just locate first position { for(k=1;k<=N;k++) if(check(i,k)) { board[i][k]='*'; queenfind(i+1,j); board[i][k]=' '; } } } /*树中常见算法:遍历,判定*/ //二叉树的先序建立 typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild; }BiNode,*Bitree; void CreatTree(Bitree &p)//先序建立二叉树 { if((ch=getchar())=='#') p=NULL; else{ p=(Bitree)malloc(sizeof(BiNode)); p->data=http://www.mamicode.com/ch;>数据结构算法总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。