这速度来得太快了,链表,栈,队列两天。树,图,一个上午就完了。桑不起啊。
摘抄点这几天写的,有自己的,也有老师的,感觉还比较可以的就放这里了。
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;
}