㈠ 求一个数据结构的经典算法!!课程设计啊,想了好久都没有想出来。
另外清数举一个例子,前序abecfg和中序beafcg。
前序先遍历根,故a为根,所以中序的be和fcg分别为左子树和右子树,前序对应是be和cfg,然后对左右子树用递归,很简单的:
struct Btree *tree(char *front,char *middle, int length)
//middle为中序遍历的字符串,front为前序遍历的字符串。
//length为字符串长度。
struct Btree *root,
//root为待建树的根结点
{
int position;
if(length>0)
{
root=(struct Btree *)malloc(sizeof(Btree));
root->data=front[0];//middle[0]是根
if(length!=1){//如果等于1,则已经完成该子树构建,否则需要递归构建左和右子树。
position=find(middle,front[0];//找答森首到根在前序遍历中的位置,字符串第一个字符从零开始计算。
root->lchild=tree(front+1,middle,position);//中序遍历的左子树在根后面,而前序遍历则在根前,就是最前面,这个递归就可以构造左子树。注意春颤子树对应的字符串长度缩小了。
root->rchild=tree(front+position,middle+positon+1,length-position-1);//构造右子树。
}
else
{
root->lchild=null;
root->rchild=null;
}//已完成构建,设置左右子树为空
else
root=null;//长度为零,说明该子树不存在,所以直接设置为空。
return(null);
}
㈡ 数据结构与算法课程设计——集合运算
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct set{
int coef;
struct set *next;
};
void createlist_p(struct set *&p,int n)
{
int i;
struct set *L;
p=(struct set *)malloc(sizeof(set));
p->next=NULL;
for(i=n;i>0;i--)
{
L=(struct set *)malloc(sizeof(set));
printf("请输入该集合中第%d个整数元素:",n-i+1);
scanf("%d",&L->coef);
L->next=p->next;
p->next=L;
}
}//生成新链表用于存放两集合中的元素
void printlist_p(struct set *&p)
{
struct set *L;
int i;
L=p->next;
if(!L) printf("该表为空!\n");
while(L!=NULL)
{
printf("%d ",L->coef);
L=L->next;
i++;
}
printf("\n");
}//打印输入的两集合中的元素
void Addset(struct set *&p,struct set *&q,struct set *&r)
{
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
k=p->next;
for(;k;)
{
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
k=k->next;
}//把第一个集合中的元素放在新集合中
k=q->next;
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
k=k->next;
for(;k;)
{
for(n=r->next;(k->coef!=n->coef)&&n->next;){
n=n->next;
}//与新集合中的元素比较
if((k->coef!=n->coef)&&!(n->next)){
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
}
k=k->next;
}//对第二个集合中的元素进行分析
}//求A∪B
void Subset(struct set *&p,struct set *&q,struct set *&r){
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
n=q->next;
for(;n;){
m=p->next;
for(;(m->coef!=n->coef)&&m->next;){
m=m->next;
}
if(m->coef==n->coef) {
k=(struct set *)malloc(sizeof(set));
k->next=r->next;
r->next=k;
k->coef=m->coef;
}
n=n->next;
}
}//求A∩B
void Intset(struct set *&p,struct set *&q,struct set *&r){
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
m=p->next;
for(;m;){
n=q->next;
for(;(m->coef!=n->coef)&&n->next;){
n=n->next;
}
if(!n->next&&(m->coef!=n->coef)) {
k=(struct set *)malloc(sizeof(set));
k->next=r->next;
r->next=k;
k->coef=m->coef;
}
m=m->next;
}
}//求A-B
void bangzhu(){
printf("\n\t\t\t***********************************");
printf("\n\t\t\t* 求集合的交并差 *");
printf("\n\t\t\t*********************************\n");
}
void main()
{
struct set *p,*q,*r;
int m,n,node;
bangzhu();
for(;;)
{
do{
printf("请输入您要选择操作的代码:\n");
printf("1:求两集合的并A∪B\n");
printf("2:求两集合的交A∩B\n");
printf("3:求两集合的差A-B\n");
printf("0:退出该程序\n");
scanf("%d",&node);
} while(node<0||node>3);
if(node==0) exit(1);
printf("\t\t\t/*请输入集合A中元素的个数:*/\n");
scanf("%d",&m);
createlist_p(p,m);
printf("\t\t\t/*请输入集合B中元素的个数:*/\n");
scanf("%d",&n);
createlist_p(q,n);
printf("集合A中元素为:");
printlist_p(p);
printf("集合B中元素为:");
printlist_p(q);
while(node<0||node>3);
switch(node)
{
case 1: Addset( p,q,r);printf("A∪B:\n");printlist_p(r);break;
case 2: Subset( p,q,r);printf("A∩B:\n");printlist_p(r);break;
case 3: Intset(p,q,r); printf("A-B:\n");printlist_p(r);break;
}
printf("\n");
}
}
可以了
楼上方法是正确的,学习!把分给楼上
㈢ 谁有这个课程设计:内存分配算法:利用静态链表,模拟实现内存分配
#include <iostream>
#include <string>
using namespace std;
struct ListNode //链表的节点
{
int begin;
int end;
int size;
int num;
bool freeable;
ListNode *next;
};
typedef ListNode * ListPtr;
class Mem
{
public:
Mem();
void getNumStringrequest();
void getNumStringfree();
void getrequest();
void getfreerequest();
// int getNum();
//void Insert();
//void Delete();
void Print();
void freemem();
void getmem();
private:
ListPtr first;
string request;
int requestnum;
int freenum;
string freerequest;
string str;
};
Mem::Mem() //初始化,把first置为空
{
first=new ListNode;
first->next=NULL;
str="";
}
void Mem::getrequest()
{
cout<<"请输入内存申请请求:"<<endl;
cin>>request;
str=str+request;
}
void Mem::getfreerequest() //每次的请求都放入str中
{
cout<<"请输入内存释放申请请求:"<<endl;
cin>>freerequest;
str=str+freerequest;
}
void Mem::getNumStringrequest()
{
int len=request.length();
string numstring=request.substr(1,len-1);
requestnum=atoi(numstring.c_str());
cout<<"申请内存的大小是:"<<requestnum<<endl;
}
void Mem::getNumStringfree() //使用atoi函数将char *(string通过strin.c_str())可以得到char *类型
{
int len=freerequest.length();
string freestring=freerequest.substr(5,len-2);
freenum=atoi(freestring.c_str());
cout<<"释放内存的起始地址是:"<<freenum<<endl;
}
void Mem::freemem()
{
ListNode *p=first;