关于数据结构算法,谁能帮我用C语言写下?谢谢

1.采用链式存储结构的队列如下图所示,分别写出其进队和出队的算法。
2.编写二叉树的后序遍历递归算法。

这是链式队列的代码:

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;

typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */

typedef struct QNode /* 结点结构 */
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;

typedef struct /* 队列的链表结构 */
{
QueuePtr front,rear; /* 队头、队尾指针 */
}LinkQueue;

Status visit(QElemType c)
{
printf("%d ",c);
return OK;
}

/* 构造一个空队列Q */
Status InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW);
Q->front->next=NULL;
return OK;
}

/* 销毁队列Q */
Status DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
return OK;
}

/* 将Q清为空队列 */
Status ClearQueue(LinkQueue *Q)
{
QueuePtr p,q;
Q->rear=Q->front;
p=Q->front->next;
Q->front->next=NULL;
while(p)
{
q=p;
p=p->next;
free(q);
}
return OK;
}

/* 若Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}

/* 求队列的长度 */
int QueueLength(LinkQueue Q)
{
int i=0;
QueuePtr p;
p=Q.front;
while(Q.rear!=p)
{
i++;
p=p->next;
}
return i;
}

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(LinkQueue Q,QElemType *e)
{
QueuePtr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
*e=p->data;
return OK;
}

/* 插入元素e为Q的新的队尾元素 */
Status EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s) /* 存储分配失败 */
exit(OVERFLOW);
s->data=e;
s->next=NULL;
Q->rear->next=s; /* 把拥有元素e的新结点s赋值给原队尾结点的后继,见图中① */
Q->rear=s; /* 把当前的s设置为队尾结点,rear指向s,见图中② */
return OK;
}

/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q,QElemType *e)
{
QueuePtr p;
if(Q->front==Q->rear)
return ERROR;
p=Q->front->next; /* 将欲删除的队头结点暂存给p,见图中① */
*e=p->data; /* 将欲删除的队头结点的值赋值给e */
Q->front->next=p->next;/* 将原队头结点的后继p->next赋值给头结点后继,见图中② */
if(Q->rear==p) /* 若队头就是队尾,则删除后将rear指向头结点,见图中③ */
Q->rear=Q->front;
free(p);
return OK;
}

/* 从队头到队尾依次对队列Q中每个元素输出 */
Status QueueTraverse(LinkQueue Q)
{
QueuePtr p;
p=Q.front->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}

int main()
{
int i;
QElemType d;
LinkQueue q;
i=InitQueue(&q);
if(i)
printf("成功地构造了一个空队列!\n");
EnQueue(&q,-5);
EnQueue(&q,5);
EnQueue(&q,10);
printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
printf("队列的元素依次为:");
QueueTraverse(q);
i=GetHead(q,&d);
if(i==OK)
printf("队头元素是:%d\n",d);
DeQueue(&q,&d);
printf("删除了队头元素%d\n",d);
i=GetHead(q,&d);
if(i==OK)
printf("新的队头元素是:%d\n",d);
ClearQueue(&q);
printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
DestroyQueue(&q);
printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);

return 0;
}

这是二叉树后序遍历的代码:

void PostOrder(BiTree root)
{
if(root==NULL)
return ;
PostOrder(root->lchild); //递归调用,后序遍历左子树
PostOrder(root->rchild); //递归调用,后序遍历右子树
printf("%c ", root->data); //输出数据
}
希望能帮到你,如还有不懂,可以加我的QQ:11301655
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-07
Node* OutQue(Queue * qu){ //出队
Node *n=qu->front;
qu=qu->next;
n->next=NULL;
return n;
}

void InQur(Queue* qu,Node *n){ //入队
n->next=qu->rear;
qu->rear=n;
}

void PostOrder(BiTree* T){ //后序遍历二叉树
if(T!=NULL){
PostOrder(T->leftchild);
PostOrder(T->rightchild);
visit(T);//访问该节点
}
}本回答被提问者和网友采纳

关于数据结构算法,谁能帮我用C语言写下?谢谢
typedef struct QNode \/* 结点结构 *\/ { QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct \/* 队列的链表结构 *\/ { QueuePtr front,rear; \/* 队头、队尾指针 *\/ }LinkQueue;Status visit(QElemType c){ printf("%d ",c);return OK;} \/* 构造一个空队列Q *...

谁能帮我把这些数据结构操作用C语言描述出来?谢了
int n,t;void suan(int n,int x){ int a[40]={0},i;while (n){ a[++a[0]]=n%x;n\/=x;} for (i=a[0];i>=1;i--)printf("%d",a[i]);} int main(){ scanf("%d%d",&n,&t);\/\/n是原数,t是进制 printf("(%d)10=(",n);suan(n,t);printf(")%d\\n",t);re...

数据结构C语言--三种以上的排序算法
在指定区间内选择一个中间值mid,将数组分为两部分,一部分比中间值小,一部分比中间值大。然后递归地对两部分进行快速排序。实现逻辑如下:初始化i和j分别为区间两端,然后从中间向两端遍历,将大于中间值的元素交换到右边,小于等于中间值的元素交换到左边。递归调用QSort函数进行排序。二叉查找树插入:...

数据结构c语言版一道题求解
include <stdio.h>#include <stdlib.h>typedef int DataType; struct SeqList{ int MAXNUM; \/* 顺序表中最大元素的个数*\/ int n; \/* 存放线性表中元素的个数n≤MAXNUM *\/ DataType *element; \/* element[0],element[1],…,element[n - 1]存放线性表中的元素 ...

关于数据结构的问题,用C语言描述
我的 关于数据结构的问题,用C语言描述 60 1.设一函数f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/180,ψ=(π*y)\/180,参数A=-0.5,B=-0.4,C=-0.1。x从0变化到89,步长为1,y从0变化到359,步长为1。采用一种数据结... 1. 设一函数 f(x,y)=(1+A*(e^B\/cosθ...

谁能帮我把这些数据结构操作用C语言描述出来?谢了
int i,k,m,n,num[nmax],*p;printf("please input the total of numbers:");scanf("%d",&n);p=num;for(i=0;i<n;i++)(p+i)=i+1;i=0;k=0;m=0;while(m<n-1){ if(*(p+i)!=0) k++;if(k==M+n){ *(p+i)=0;k=0;m++;} i++;if(i==n) i=0;} while(*p...

谁懂数据结构C语言,帮个忙吧,我整了好久都没整好,会的帮我一下谢了
{ int data[MAXSIZE];int last;}SeqList;\/*顺序表的初始化*\/ SeqList *init_SeqList(){ SeqList *L;L=malloc(sizeof(SeqList));L->last=-1;return L;} \/*插入数据*\/ void Insert_SeqList(SeqList *L,int i,int x){ int j;if(L->last==MAXSIZE-1){ printf("full "); \/...

数据结构,c语言~写一个算法:删除整数数组中相同的多余整数(只保留第...
int i,j,k,n = sizeof(a)\/sizeof(a[0]);for(i = 0; i < n; ++i)printf("%d ",a[i]);printf("\\n");for(i = 0; i < n; ++i) {for(j = i + 1; j < n - 1; ++j) {if(a[j] == a[i]) {for(k = j; k < n - 1; ++k)a[k] = a[k + 1]...

数据结构栈的建立怎么弄 用C语言写 就写个特别简单的例子就行 最好标注...
typedef struct { int data[MAXSIZE];int top;}SqStack;void InitStack(SqStack *S){ S->top=0;} void Push(SqStack *S,int e){ if(S->top==MAXSIZE-1)printf("栈满!\\n");S->top++;S->data[S->top]=e;} void Pop(SqStack *S,int *e){ if(S->top==-1)("栈中已...

C语言版数据结构程序设计求大神帮助
struct { SElemType elem[MaxSize]; int front,rear; }SqQueue; \/* 队列 *\/ void InitQueue(SqQueue* pQ) \/* 初始化队列,开始时队列为空 *\/ { pQ->front=pQ->rear=0; } int EnQueue(SqQueue* pQ,SElemType e) \/* 进队 *\/ { if ((pQ->rear+1)%MaxSize == pQ->front)...

相似回答