数据结构c语言版视频教程

Python017

数据结构c语言版视频教程,第1张

10《数据结构》【005】

链接:https://pan.baidu.com/s/1jHDInT5qZOnvIZPjyVHOBQ

提取码:2r91 复制这段内容后打开百度网盘手机APP,操作更方便哦!

若资源有问题欢迎追问~

/* 二叉树应用 */#include "stdio.h"

#include "stdlib.h"typedef char ElemType /* 结点数据的类型 */

typedef struct BiTNode{

ElemType data

struct BiTNode *lchild,*rchild

}BiTNode /* 树结点类型 *//*栈的定义及基本操作*/

#define MaxSize 100

typedef BiTNode* SElemType /* 栈和队列的结点类型,用于存放树结点 */

typedef struct {

SElemType elem[MaxSize]

int top

}SqStack /* 栈 */void InitStack(SqStack *pS) /* 初始化栈,开始时栈为空 */

{

pS->top=0/* top指向栈顶的上一个元素 */

}int Push(SqStack *pS,SElemType e) /* 进栈 */

{

if (pS->top==MaxSize-1) /* 栈满 */

return 0 pS->elem[pS->top]=e

pS->top=pS->top+1

return 1

}int Pop(SqStack *pS,SElemType *pe)/* 出栈 */

{

if (pS->top==0) /* 栈空 */

return 0 pS->top = pS->top - 1

*pe = pS->elem[pS->top]

return 1

}/*队列(循环队列)的定义及基本操作*/typedef 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) /* 队满 */

return 0

pQ->elem[pQ->rear] = e

pQ->rear = (pQ->rear+1)%MaxSize

return 1

}int DeQueue(SqQueue* pQ,SElemType* pe) /* 出队 */

{

if (pQ->rear == pQ->front)/* 队空 */

return 0

*pe = pQ->elem[pQ->front]

pQ->front = (pQ->front+1)%MaxSize

return 1

}

/* 先根遍历 */

void preorder(BiTNode *bt)

{ if(bt!=NULL)

{ printf("%c ",bt->data)

preorder(bt->lchild)

preorder(bt->rchild)

}

} /* 中根遍历 */

void inorder(BiTNode *bt)

{ if(bt!=NULL)

{ inorder(bt->lchild)

printf("%c ",bt->data)

inorder(bt->rchild)

}

}

/* 后根遍历 */

void postorder(BiTNode *bt)

{ if(bt!=NULL)

{ postorder(bt->lchild)

postorder(bt->rchild)

printf("%c ",bt->data)

}

}/* 非递归算法的中根遍历(后进先出,用了栈的思想) */

void inorder_fdg(BiTNode *bt)

{

BiTNode *p

SqStack s

InitStack(&s)

p=bt

do

{ while(p!=NULL)

{ Push(&s,p)

p=p->lchild

}

if(s.top!=0)

{ Pop(&s,&p)

printf("%c ",p->data)

p=p->rchild

}

}while(s.top!=0||p!=NULL)

}/* 用队列实现层次遍历 */

void lev_traverse(BiTNode* bt)

{

SqQueue q

BiTNode *p

p=bt

InitQueue(&q)

EnQueue(&q,p)

while(!(q.rear==q.front)) { /* 当队列不空 */

DeQueue(&q,&p)

printf("%c ",p->data) if(p->lchild!=NULL)

EnQueue(&q,p->lchild) if(p->rchild!=NULL)

EnQueue(&q,p->rchild)

}

}

/* 利用先根序列建立二叉树,空的子树也要输入,用空格表示,建立的树通过函数返回,避免使用指针的指针 */

BiTNode *crt_bt_pre()

{ char ch

BiTNode *bt

scanf("%c",&ch) if(ch==' ') bt=NULL

else

{ bt=(BiTNode *)malloc(sizeof(BiTNode))

bt->data=ch

bt->lchild=crt_bt_pre()

bt->rchild=crt_bt_pre()

}

return(bt)

}/* 利用先根序列建立二叉树,空的子树也要输入,用空格表示,建立的树通过参数返回,注意和上述方法比较,想想还有什么办法? */

void crt_bt_pre_2(BiTNode **bt)

{ char ch

scanf("%c",&ch) if(ch==' ') (*bt)=NULL

else

{ (*bt)=(BiTNode *)malloc(sizeof(BiTNode))

(*bt)->data=ch

crt_bt_pre_2(&(*bt)->lchild)

crt_bt_pre_2(&(*bt)->rchild)

}

}

/* 求叶子数 */

int leaf(BiTNode *bt)

{

if (bt==NULL) return 0

else {

if (bt->lchild==NULL&&bt->rchild==NULL) return 1

else

return leaf(bt->lchild)+leaf(bt->rchild)

}}/* 求树的高度 */

int high(BiTNode *bt)

{

if (bt==NULL) return 0

else {

return max(high(bt->lchild),high(bt->rchild))+1

}}

/* 二叉树的释放*/

void freetree(BiTNode *bt)

{ if(bt!=NULL)

{ freetree(bt->lchild)

freetree(bt->rchild)

free(bt)

bt=NULL

}

}main()

{

BiTNode *T,*temp[20] /* 笨方法建立二叉树 */

/* temp[0]=(BiTNode*)malloc(sizeof(BiTNode))

temp[0]->data = '-' temp[1]=(BiTNode*)malloc(sizeof(BiTNode))

temp[1]->data = '+'

temp[0]->lchild = temp[1] temp[2]=(BiTNode*)malloc(sizeof(BiTNode))

temp[2]->data = '/'

temp[0]->rchild = temp[2] temp[3]=(BiTNode*)malloc(sizeof(BiTNode))

temp[3]->data = 'a'

temp[3]->lchild=NULLtemp[3]->rchild=NULL

temp[1]->lchild = temp[3] temp[4]=(BiTNode*)malloc(sizeof(BiTNode))

temp[4]->data = '*'

temp[1]->rchild = temp[4] temp[5]=(BiTNode*)malloc(sizeof(BiTNode))

temp[5]->data = 'e'

temp[5]->lchild=NULLtemp[5]->rchild=NULL

temp[2]->lchild = temp[5] temp[6]=(BiTNode*)malloc(sizeof(BiTNode))

temp[6]->data = 'f'

temp[6]->lchild=NULLtemp[6]->rchild=NULL

temp[2]->rchild = temp[6] temp[7]=(BiTNode*)malloc(sizeof(BiTNode))

temp[7]->data = 'b'

temp[7]->lchild=NULLtemp[7]->rchild=NULL

temp[4]->lchild = temp[7] temp[8]=(BiTNode*)malloc(sizeof(BiTNode))

temp[8]->data = '-'

temp[4]->rchild = temp[8] temp[9]=(BiTNode*)malloc(sizeof(BiTNode))

temp[9]->data = 'c'

temp[9]->lchild=NULLtemp[9]->rchild=NULL

temp[8]->lchild = temp[9] temp[10]=(BiTNode*)malloc(sizeof(BiTNode))

temp[10]->data = 'd'

temp[10]->lchild=NULLtemp[10]->rchild=NULL

temp[8]->rchild = temp[10] T=temp[0] */

/*输出树和各种遍历、叶子数、树的高度*/

/*printf("\ntree:\n")

printf(" -\n")

printf(" +/\n")

printf(" a *e f\n")

printf("0 0b - 0 00 0\n")

printf(" 0 0c d\n") printf("\n\nPreOrder:\n")

preorder(T) printf("\nInOrder:\n")

inorder(T) printf("\nPostOrder:\n")

postorder(T) printf("\ninorder_fdg:\n")

inorder_fdg(T) printf("\nlev_traverse:\n")

lev_traverse(T)

printf("\nleaf num:%d",leaf(T))

printf("\nTree high:%d",high(T))

freetree(T) */ /* 按先序列建树,用空格表示空子树*/ printf("\n\nplease input inorder:such as 'abc de g f '\n")

/*T = crt_bt_pre()*/

crt_bt_pre_2(&T) printf("\n\nPreOrder:\n")

preorder(T) printf("\nInOrder:\n")

inorder(T) printf("\nPostOrder:\n")

postorder(T) printf("\ninorder_fdg:\n")

inorder_fdg(T) printf("\nlev_traverse:\n")

lev_traverse(T)

printf("\nleaf num:%d",leaf(T))

printf("\nTree high:%d",high(T))

freetree(T)

getch()

}

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef int ElemType

/*单项链表的声明*/

typedef struct PolynNode{

int coef// 系数

int expn// 指数

struct PolynNode *next}PolynNode,*PolynList

/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/

/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)

{

int i

下载

原文档已转码为如下格式,以便移动设备查看

数据结构(c语言)用单链表存储一元多项式,并实现两个多项式的相加运算【最新】

阅读:1037次 页数:36页 2016-03-21 举报

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef int ElemType

/*单项链表的声明*/

typedef struct PolynNode{

int coef// 系数

int expn// 指数

struct PolynNode *next}PolynNode,*PolynList

/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/

/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)

{

int i

PolynList p,q

L=(PolynList)malloc(sizeof(PolynNode))// 生成头结点

L->next=NULL

q=L

printf("成对输入%d个数据\n",n)

for(i=1i<=ni++)

{

p=(PolynList)malloc(sizeof(PolynNode))

scanf("%d%d",&p->coef,&p->expn)//指数和系数成对输入

q->next=p

q=q->next

}

p->next=NULL

}

// 初始条件:单链表L已存在

// 操作结果: 依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败

void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)) {

PolynList p=L->next

while(p)

{

vi(p->coef, p->expn)

if(p->next)

{

printf(" + ")//“+”号的输出,最后一项后面没有“+”

}

p=p->next

}

printf("\n")

}

/*ListTraverse()调用的函数(类型要一致)*/ void visit(ElemType c, ElemType e) {

if(c != 0)

{

printf("%dX^%d",c,e)//格式化输出多项式每一项

}

}

/* 多项式相加,原理:归并 */ /* 参数:两个已经存在的多项式 */ /* 返回值:归并后新的多项式的头结点 */

PolynList MergeList(PolynList La, PolynList Lb) {

PolynList pa, pb, pc, Lc

pa = La->next

pb = Lb->next

Lc = pc = La// 用La的头结点作为Lc的头结点

while(pa&&pb)

{

if(pa->expn <pb->expn)

{

pc->next = pa//如果指数不相等,pc指针连上指数小的结

点,

pc = pa

pa = pa->next//指向该结点的指针后移

}

else if (pa ->expn >pb->expn )

{

pc->next = pb//pc指针连上指数小的结点,

pc = pb

pb = pb->next//指向该结点的指针后移

}

else //(pa ->expn = pb->expn )

{

pa->coef = pa->coef + pb->coef//指数相等时,系数相加

pc->next = pa

pc = pa

pa = pa->next//两指针都往后移

pb = pb->next

}

}

pc->next = pa ? pa:pb// 插入剩余段

return Lc

}

void main()

{

PolynList ha,hb,hc

printf("非递减输入多项式ha, ")

CreatePolyn(ha,5)// 正位序输入n个元素的值

printf("非递减输入多项式hb, ")

CreatePolyn(hb,5)// 正位序输入n个元素的值