这速度来得太快了,链表,栈,队列两天。树,图,一个上午就完了。桑不起啊。
摘抄点这几天写的,有自己的,也有老师的,感觉还比较可以的就放这里了。
day8:顺序表,链表。
这个是老师布置的作业,单链表倒置,自己也写出来了。想法基本也差不多,不过老师的讲评代码还是要清晰些
单链表倒置:头插法
void invertlist(PNODE pHead) //单链表倒置 用的头插法,把每个节点插入到头就实现倒置了 { PNODE p,q; p = pHead->next; pHead->next = NULL; while(p) { q = p; p = p->next; q->next = pHead->next; pHead->next = q; } }
day9:栈,队列。
讲了,顺序栈,链式栈,顺序队列,链式队列等。
完了,老师布置了作业,用栈实现字符串里的简单加减法。比如“3+2-5”;“(3+3)*(3+1)”等等;
我感觉写得很不爽,虽然能实功能,但没有一点成就感
int duoxiangshi(SQCSLINK sqcsnum,SQSYMBOL sqcssy,char str[]) //操作数栈 操作符栈 { int i = 0; int level = 1,flag=0; //优先级相同和高为2,低为1 int num; if(*str == '(') i++; //如果第一个就是"("就跳过, getnum(sqcsnum,str,&i); //取操作数入栈 while( !(*(str+i) == 0 && sqcsnum->top == 1) ) //如果字符串遍历完了,且操作数栈里只有一个数 { //就退出循环 while( level == 1 && *(str+i) != 0) //如果前一个符号优先级低于后面 { getsymbol(sqcssy,str,&i);//取操作符入栈 if(*(str+i) == '(') { i++; flag=1; //遇到正括号,当前优先级直接为低 } getnum(sqcsnum,str,&i); //取操作数入栈 level = compare(sqcssy,str,&i,&flag);//下一个操作符比较栈里操作符优先级 } getres(sqcsnum,sqcssy);//计算,结果入栈,符号出栈 level=1; } GetCs(sqcsnum,&num); return num; }
约瑟夫问题:数到三就自杀,最后剩下一个
int yuesefu(NODE * pHead) { int count = 0; //数数 int n = N-1; //循环次数,设一共有 N 个人,则需要杀死 N-1 个人,所以这里循环N-1次 NODE * pBack = NULL; while(n) { pHead = pHead->next; count++; //开始数数 if(count == 2) //当数到2的时候 (因为是单链表,只能找到3的前面一个 { count = 1; //杀掉2的下面一个,跳转到3的下一个,也就是4,然后计数直接赋值1 pBack = pHead->next; pHead->next = pBack->next; pHead = pBack->next; pBack->next = NULL; //删除节点 (杀死 printf("第%d次删除节点为%d\n",N-n,pBack->data); free(pBack); n--; } } return pHead->data; }
额,今天的,树和图,图是完全没写。就弄了下树的程序。基本都是递归。这递归,太坑了。你要是想不通怎么想也不通,但是只要不钻牛角尖额,又还说的过去。
不过我感觉递归这个东西,不好打整,有点打脑壳。
额,这个是老师要求的,用非递归算法,遍历二叉树:
//二叉树非递归算法 void SycilBtree(PBTREE bt,PSTACK st) { PBTREE ptree_b = NULL; if(bt) //如果根节点不空 PushStack(st,bt); //根节点入栈 while(!EmptyStack(st)) //栈不空 { PopStack(st,&ptree_b); //出栈 printf("%d ",ptree_b->data); //访问 这里可以左其他事情,比如交换左右孩子等 if(ptree_b->rchild) //如果右子树不空 PushStack(st,ptree_b->rchild); //右子树指针入栈 if(ptree_b->lchild) //如果左子树 PushStack(st,ptree_b->lchild); //左子树指针入栈 } putchar(10); } //求树的深度 int DeepBtree(PBTREE bt) //求树的深度 { if(!bt) return 0; else return DeepBtree(bt->lchild) > DeepBtree(bt->rchild) ? DeepBtree(bt->lchild)+1 : DeepBtree(bt->rchild)+1; }