Linux基础和C高级,day8,9,10,数据结构

这速度来得太快了,链表,栈,队列两天。树,图,一个上午就完了。桑不起啊。

摘抄点这几天写的,有自己的,也有老师的,感觉还比较可以的就放这里了。


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;
}

猜你喜欢

转载自blog.csdn.net/mjfmjj/article/details/17028363