/*-------------------------------------------------------数据结构部分------------------------------------------------------*/
/*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);
}
}
}
}
东北大学计算机专业(专业硕士)研究生入学考试2010年真题
最新推荐文章于 2021-08-31 06:23:39 发布