数据结构学习

**

先序构建二叉树,按先序、中序、后序输出

**

由于以前学习的基础不扎实还是有部分代码理解不清
已理解的地方会注释
&表示引用,更改引用值会更改被引用的值;*表示指针,和原来的值独立。

#include <stdio.h>
#include <stdlib.h>
#define MAX_TREE_SIZE 100

typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreateBiTree(BiTree &T)
{//按先序输入二叉树结点,#表示空树 
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
	{
		T=NULL;
	}else{
	T = (BiTree)malloc(sizeof(BiTNode));
	T->data=ch;
	CreateBiTree(T->lchild);
	CreateBiTree(T->rchild);
	}
}


void PreOrderTravel(BiTree T)
{//先序遍历  根左右
    if(T==NULL) return;			//结束本次循环 
    printf("%c ",T->data);		//正在遍历的结点 
    PreOrderTravel(T->lchild);	//进入左结点 
    PreOrderTravel(T->rchild);	//左结点为空进入右结点 
}
 

void InOrderTravel(BiTree T)
{//中序遍历 左根右
    if(T==NULL)return;
    InOrderTravel(T->lchild);
    printf("%c ",T->data);
    InOrderTravel(T->rchild);
}
 

void TailOrderTravel(BiTree T)
{//后序遍历 左右根
    if(T==NULL) return; 
    TailOrderTravel(T->lchild);
    TailOrderTravel(T->rchild);
    printf("%c ",T->data);
}

int main()
{
	printf("请输入二叉树先序遍历构建二叉树(#代表空):");
	BiTree T;
	T=(BiTree)malloc(sizeof(BiTNode));
	
	CreateBiTree(T);
	
	printf("先序遍历结果:");
	PreOrderTravel(T);
	printf("\n"); 
	
	printf("中序遍历结果:");
	InOrderTravel(T);
	printf("\n"); 
	
	printf("后序遍历结果:");
	TailOrderTravel(T); 
	printf("\n"); 
}

**

两个顺序表差集

**

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 3

typedef struct
{
	int *elem;
	int length;
	int listsize;
}SqList;

int InitList(SqList &L)
{//初始化顺序表 
	L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L.elem) exit(OVERFLOW);
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	return 0;
}

void defference(SqList *A,SqList *B,SqList *C)
{//删除相同的元素 
	int i = 0,j = 0,k = 0;
	
	for(i = 0; i < A->length ; i++)
	{
		j = 0;
		
		while(j < B->length && B->elem [j] != A->elem [i]) //找不同的元素 
		{
			j++;
		}
		
		if(j == B->length )//说明找到不同元素 
		{
			C->elem [k] = A->elem [i];
			
			k++;	
		}
	}
	
	C->length = k;
}

void OuputList(SqList L)
{//输出元素 
	int i;
	for(i=0;i<L.length;i++)
	{
		printf("%2d",L.elem[i]);
	}
	printf("\n");
}

int main()
{
	int n,m;
	int i,j;
	SqList La,Lb,Lc;
	InitList(La);
	InitList(Lb);
	InitList(Lc);
	
	printf("请输入La长度:");
	scanf("%d",&n);
	La.length=0;
	printf("请输入La的元素:\n");
	for(i=0;i<n;i++)
	{//输入La 
		scanf("%d",&La.elem[i]);
	}
	La.length=n;
	
	printf("请输入Lb长度:");
	scanf("%d",&m);
	Lb.length=0;
	printf("请输入Lb的元素:\n");
	for(j=0;j<m;j++)
	{//输入Lb 
		scanf("%d",&Lb.elem[j]);
	}
	Lb.length=m;
	
	Lc.length=0;
	
	printf("La:");
	OuputList(La);
	
	printf("Lb:");
	OuputList(Lb);
	
	defference(&La,&Lb,&Lc);
	printf("Lc:");
	OuputList(Lc);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值