东北大学计算机专业(专业硕士)研究生入学考试2010年真题

/*-------------------------------------------------------数据结构部分------------------------------------------------------*/
/*1.假设线性表L用带头结点的单链表存储,且至少有两个结点,每个结点的数据域为整型值。编写算法以判断该链表中每一个结点的值是否等于其后继
    两个结点的值之和,若满足上述要求,返回1并输出最大值;否则,返回0并输出最小值。*/
//这个最大值,最小值是指的什么啊?和的最值还是结点的最值……  下面按结点的最值做了啊,反正思想是一样的
typedef struct LNode
{
	int data;
	struct LNode *next;
}LinkList;

int SumNode(LinkList *L)
{
	int max = 0,min = 0,flag = 0;
	while(L->next->next != NULL)
	{
		if(L->data == L->next->data + L->next->next->data)
		{
			flag = 1;  //满足条件
			if(max < L->data)
				max = L->data;
			if(min > L->data)
				min = L->data;
			L = L->next;
		}
		else
		{
			L = L->next;
			continue;
		}
	}
}
	
/*2.假设一个仅包含二元运算符的算术表达式以二叉链表形式存储在二叉树T中,编写按后序遍历计算表达式值的算法。*/
//过程:从左到右扫描后缀表达式,遇到字符的操作数就转化为数值后进栈,遇到运算符就从栈中出栈两个操作数,进行相应的运算后进栈,如此这样直到后
//缀表达式结束,这时栈中只有一个数,即为表达式的值。
#define MaxSize 50
char postexp[MaxSize];  //存放后缀表达式
int n = 0; //后缀表达式的长度
void PostExp(BTNode *T)
{
	if(T != NULL)
	{
		PostExp(T->lchild);
		PostExp(T->rchild);
		postexp[n++] = T->data;
	}
}
float CompValue()
{
	float st[MaxSize],opnd,opnd1,opnd2;
	char ch;
	int top = -1, i = 0;
	while(i < n)
	{
		ch = postexp[i++];
		switch(ch)
		{
			case '+':
				opnd1 = st[top--];
				opnd2 = st[top--];
				opnd = opnd1 + opnd2;
				top++;
				st[top] = opnd;
				break;
			case '-':
				opnd1 = st[top--];
				opnd2 = st[top--];
				opnd = opnd2 - opnd1;
				top++;
				st[top] = opnd;
				break;
			case '*':
				opnd1 = st[top--];
				opnd2 = st[top--];
				opnd = opnd1 * opnd2;
				top++;
				st[top] = opnd;
				break;	
			case '/':
				opnd1 = st[top--];
				opnd2 = st[top--];
				if(opnd1 == 0)
					exit(0);
				opnd = opnd2 / opnd1;
				top++;
				st[top] = opnd;
				break;					
		}
	}
	return st[0];
}
float ExpValue(BTNode *T)
{
	PostExp(T);
	return CompValue();
}
/*3.图的D_遍历类似于广度优先遍历(BFS),不同之处在于使用栈替代BFS中的队列,入出队列的操作改为入出栈的操作,即当一个顶点的所有邻接点
    被搜索之后,下一个搜索出发点应该是最近入栈(栈顶)的顶点,用邻接表做存储结构,编写D_遍历算法。*/
//一般广度优先遍历用队列,深度优先用栈的……下面用队列实现的BFS,用栈实现有些难度就不做了……
void BFSTravrse(Graph G,Status(*Visit) (int v))
{
    for(v=0; v<G.vexnum; ++v) visited[v] = FALSE;
    InitQueue(Q);                               // 队列置空
    for(v=0; v<G.vexnum; ++v)
    if(!visited[v]) 
	{                            // V尚未访问
        visited[v] = True;Visit(v);
        EnQueue(Q,V);  //(V入队列)
        while(!QueueEmpty(Q))
		{
             DeQueue(Q,u);                    // 队头元素出队列并置为U
             for(w=FirstAdjVex(G,u);w>= 0;w =NextAdjVex(G,u,w))
                if (! Visited[w])  
				{          // W为U的尚未访问的邻接顶点
                   Visited[w] = TRUE; Visit(w);
                    EnQueue(Q,w);
                }
        }
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值