数据结构报告C语言上机操作.docx

上传人:b****8 文档编号:23838738 上传时间:2023-05-21 格式:DOCX 页数:43 大小:445.12KB
下载 相关 举报
数据结构报告C语言上机操作.docx_第1页
第1页 / 共43页
数据结构报告C语言上机操作.docx_第2页
第2页 / 共43页
数据结构报告C语言上机操作.docx_第3页
第3页 / 共43页
数据结构报告C语言上机操作.docx_第4页
第4页 / 共43页
数据结构报告C语言上机操作.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

数据结构报告C语言上机操作.docx

《数据结构报告C语言上机操作.docx》由会员分享,可在线阅读,更多相关《数据结构报告C语言上机操作.docx(43页珍藏版)》请在冰豆网上搜索。

数据结构报告C语言上机操作.docx

数据结构报告C语言上机操作

 

数据结构

C语言上机操作

 

学部:

信息科学与技术学部

学号:

指导老师:

姓名:

专业班级:

 

一、实验目的

熟练C言语语法及操作,运用C语言实现数据结构中的具体过程。

理解数据结构在计算机中的具体形式。

学习数据结构中赫夫曼变法,表和图的实现过程。

二、实验环境及参考书籍

MicrosoftVisualC++6.0

数据结构(C语言版),程序设计基础(C语言)。

三、实验内容

赫夫曼编码:

#include"stdio.h"

#include"string.h"

#include"conio.h"

#include"stdlib.h"

/**/

/*根据统计函数得到字符的种类数N和各自出现的次数,建立N个结点,由此构造一颗哈夫曼树。

*/

#defineN30/*叶子结点数,即在信息中最多可出现30种字符*/

typedefstruct

{

chardata;/*编码对应的字符*/

intweight;/*结点的权值*/

intlchild,rchild,parent;/*左右孩子及双亲的下标*/

}HTNode;

intStat(char*st,intcnt[],charstr[])/*统计字符信息中出现的字符种类数和各字符出现的次数*/

{

char*p;

inti,j,k,num[27];

for(i=0;i<26;i++)

{num[i]=0;}

for(p=st;*p!

='\0';p++)

{

//*p=tolower(*p);/*若字符信息中有大写字母,则将其转换成小写字母*/

if(*p>='a'&&*p<='z')/**/

{

k=*p-96;

num[k]++;

}

}

j=0;

for(i=0;i<26;i++)

{

if(num[i]!

=0)

{

str[j]=i+96;

cnt[j]=num[i];

j++;

}

}

returnj;

}

voidCreatHufmTree(HTNodeht[],intn)/*建立哈夫曼树*/

{

inti,k,m1,m2,l,r;

for(i=0;i<2*n-1;i++)

ht[i].lchild=ht[i].rchild=ht[i].parent=0;/*对所有结点的左右孩子及双亲指针域赋空值*/

for(i=n;i<2*n-1;i++)

{

m1=m2=10000;/*m1为最小值,m2为次小值*/

l=r=0;

for(k=0;k<=i-1;k++)

if(ht[k].parent==0&&ht[k].weight

{

m2=m1;

r=l;

m1=ht[k].weight;

l=k;

}

elseif(ht[k].parent==0&&ht[k].weight

{

m2=ht[k].weight;

r=k;

}

ht[l].parent=i;/*下标为i的新结点成为权值最小的两个结点的双亲*/

ht[r].parent=i;

ht[i].weight=ht[l].weight+ht[r].weight;/*新结点的权值为两个结点的权值之和*/

ht[i].lchild=l;/*权值最小的结点是新结点的左孩子*/

ht[i].rchild=r;/*权值次小的结点是新结点的右孩子*/

}

}

typedefstruct

{

charbits[N];/*存放哈夫曼编码的字符数组*/

intstart;/*记录编码的起始位置,因为每种字符的编码长度不同*/

}HCode;

voidHufmCode(HTNodeht[],HCodehcd[],intn)/*利用哈夫曼树求出各字符的哈夫曼编码*/

{

inti,f,c,k;

HCodecd;/*用于临时存放编码串*/

for(i=0;i

{

cd.start=n;

c=i;/*从叶子结点ht[i]开始向上回溯*/

f=ht[i].parent;/*找到叶子结点ht[i]的双亲结点ht[f]*/

while(f!

=0)/*回溯到树根结点为止*/

{

if(ht[f].lchild==c)/*若ht[c]是ht[f]的左孩子,生成代码为0*/

cd.bits[cd.start--]='0';

else/*若ht[c]是ht[f]的右孩子,生成代码为1*/

cd.bits[cd.start--]='1';

c=f;

f=ht[f].parent;

}

cd.start++;/*start指向哈夫曼编码最开始字符*/

hcd[i]=cd;/*将得到的第i种字符的哈夫曼编码存入hcd[i]中*/

}

printf("输出哈夫曼编码:

\n");

for(i=0;i

{

printf("%c:

",ht[i].data);

for(k=hcd[i].start;k<=n;k++)

printf("%c",hcd[i].bits[k]);

printf("\n");

}

}

voidTsCode(char*bit,HTNodeht[],intn)/*哈夫曼树的译码*/

{

inti;

i=2*n-2;/*将树根节点的下标赋值i,从根结点出发向下搜索*/

while(*bit!

='\0')/*若编码没有结束*/

{

if(*bit=='0')

i=ht[i].lchild;/*走向左孩子结点*/

else

i=ht[i].rchild;/*走向右孩子结点*/

if(ht[i].lchild==0&&ht[i].rchild==0)/*判断是否已经走向叶子结点*/

{

printf("%c",ht[i].data);/*输出此编码对应的字符*/

i=2*n-2;/*重新回到根结点,准备下一次搜索*/

}

bit++;/*取编码中的下一个代码*/

}

}

voidmain()

{

inti,j,k,n,t,x,cnt[27];

charst[50],sr[27],bm[200];

HTNodeht[2*N-1];/*用于存放树中的所有结点*/

HCodehcd[N];/*用于存放字符的哈夫曼编码*/

while

(1)

{

printf("1-输出待传送的字符信息2-编码3-发送4-接受并译码0-退出\n");

scanf("%d",&x);

switch(x)

{

case1:

printf("请输入要发送的字符串信息:

");

scanf("%s",st);

break;

case2:

n=Stat(st,cnt,sr);

for(i=0;i

{

ht[i].data=sr[i];

ht[i].weight=cnt[i];

}

CreatHufmTree(ht,n);

HufmCode(ht,hcd,n);

break;

case3:

t=0;

for(j=0;st[j]!

='\0';j++)

{

for(i=0;i

if(ht[i].data==st[j])

{

for(k=hcd[i].start;k<=n;k++)

{

bm[t]=hcd[i].bits[k];

t++;

}

break;

}

}

bm[t]='\0';

printf("发送完毕!

\n");

break;

case4:

printf("接收到的编码信息为:

");

puts(bm);

printf("译码后的结果为:

");

TsCode(bm,ht,n);

printf("\n");

break;

case0:

exit(0);

}

}

}

链表建立

#include;

typedefstruct{

charnum[8];/*学号*/

charname[9];/*姓名*/

chargender[3];/*性别*/

intscore;/*成绩*/

}DataType;

typedefstructnode{

DataTypedata;

structnode*next;

}ListNode;

typedefListNode*LinkList;

LinkListhead;

/*函数说明*/

intmenu_select();

LinkListcreateList(void);

voidprintList(LinkListhead);

ListNode*findList(LinkListhead);

intinsertNode(LinkListhead,ListNode*p,inti);

voiddelNode(LinkListhead);

voidmain()

{

ListNode*p;

inti;

while

(1){

switch(menu_select())

{

case1:

printf("**************************************\n");

printf("学生信息链表的建立\n");

printf("***************************************\n");

head=createList();

break;

case2:

printf("**************************************\n");

printf("添加学生信息\n");

printf("**************************************\n");

printf("\n学号(8)姓名(8)性别成绩\n");

printf("**************************************\n");

p=(ListNode*)malloc(sizeof(ListNode));

scanf("%s%s%s%d",p->data.num,p->data.name,p->data.gender,&p->data.score);

printf("请输入要插入的位置:

\n");

fflush(stdin);

scanf("%d",&i);

if(insertNode(head,p,i)==-1)

{

printf("没有合适的插入点!

\n");

}

else

{

printf("结点已经插入\n");

}

break;

case3:

printf("**************************************\n");

printf("查询学生信息\n");

printf("**************************************\n");

p=findList(head);

if(p!

=NULL)

{

printf("\n学号(8)姓名(8)性别成绩\n");

printf("-------------------------------------------\n");

printf("%s,%s,%s,%d\n",p->data.num,p->data.name,p->data.gender,p->data.score);

printf("------------------------------------------------------------------\n");

}

else

printf("没查到要查询的学生信息!

");

break;

case4:

printf("**************************************\n");

printf("删除学生信息\n");

printf("**************************************\n");

delNode(head);

break;

case5:

printf("**************************************\n");

printf("输出所有学生信息\n");

printf("**************************************\n");

printList(head);

break;

case0:

printf("再见!

\n");

getch();

return;

}

}

}

intmenu_select()

{

intsn;

printf("\n学生信息管理系统\n");

printf("=========================================\n");

printf("1.学生信息链表的建立\n");

printf("2.插入学生信息\n");

printf("3.查询学生信息\n");

printf("4.删除学生信息\n");

printf("5.输出所有学生信息\n");

printf("0.退出管理系统\n");

printf("==========================================\n");

printf("请选择0-5:

\n");

for(;;)

{

scanf("%d",&sn);

if(sn<0||sn>5)

printf("\n\t输入错误,重选0-5\n");

else

break;

}

returnsn;

}

LinkListcreateList(void)

{

ListNode*p,*rear;

charflag='y';

head=(ListNode*)malloc(sizeof(ListNode));

rear=head;

while(flag=='y'||flag=='Y')

{

p=(ListNode*)malloc(sizeof(ListNode));

printf("\n学号(8)姓名(8)性别成绩\n");

scanf("%s%s%s%d",p->data.num,p->data.name,p->data.gender,&p->data.score);

rear->next=p;

rear=p;

printf("继续输入吗?

(y/n):

");

flag=getch();

}

rear->next=NULL;

returnhead;

}

voidprintList(LinkListhead)

{

ListNode*p;

p=head->next;

printf("\n学号(8)姓名(8)性别成绩\n");

printf("-------------------------------------------\n");

while(p!

=NULL)

{

printf("%s,%s,%s,%d\n",p->data.num,p->data.name,p->data.gender,p->data.score);

printf("------------------------------------------------------------------\n");

p=p->next;

}

}

ListNode*findList(LinkListhead)

{

ListNode*p;

charnum[8];

charname[9];

intxz;

printf("===========================\n");

printf("1、按学号查询\n");

printf("2、按姓名查询\n");

printf("===========================\n");

printf("请选择:

");

p=head->next;

scanf("%d",&xz);

if(xz==1)

{

printf("请输入要查找学生的学号:

");

scanf("%s",num);

while(p&&strcmp(p->data.num,num)!

=0)

p=p->next;

}

else

if(xz==2)

{

printf("请输入要查找学生的姓名:

");

scanf("%s",name);

while(p&&strcmp(p->data.name,name)!

=0)

p=p->next;

}

returnp;

}

intinsertNode(LinkListhead,ListNode*p,inti)

{

ListNode*p1;

intj=1;

p1=head;

if(p1->next==NULL)/*空表:

插入作为第一个结点*/

{

if(i==0)

{

p1->next=p;

p->next=NULL;

}

else

return-1;

}

while((j<=i-1)&&(p1!

=NULL))/*找到第i-1个结点,p1指向该结点*/

{

p1=p1->next;

j++;

}

if(p1==NULL)/*没有合适的插入点*/

return-1;

p->next=p1->next;

p1->next=p;

return0;

}

voiddelNode(LinkListhead)

{

ListNode*p,*q;

printf("请先查找您要删除的学生信息:

\n");

p=findList(head);

if(p==NULL)

{

printf("没有查到要删除的学生信息");

return;

}

q=head;

while(q!

=NULL&&q->next!

=p)q=q->next;

q->next=p->next;

free(p);

printf("该学生信息已被删除!

\n");

}

图:

#include

#include

#include

#definemaxlen10

#definelarge999

#definetrue1

#definefalse0

#defineok1

#defineerror0

#defineoverflow-2

#definenull0

typedefintstatus;

typedefstruct

{

inta[maxlen],b[maxlen],h[maxlen];/*第K边的起点,终点,权值*/

charvexs[maxlen];/*顶点信息集合*/

intvexnum,arcnum;/*顶点数和边数*/

intkind;/*图的类型*/

intarcs[maxlen][maxlen];/*邻接矩阵*/

}graph;

typedefstructnode/*表结点结构*/

{

intadjvex;/*存放与头结点相邻接的顶点在数组中的序号*/

intinfo;/*权值*/

structnode*next;/*指向与头结点相邻接下一个顶点的表结点*/

}edgenode;

typedefstruct/*头结点结构*/

{

intid;/*顶点入度*/

chardata;/*顶点信息*/

edgenode*link;/*指向头结点对应的单链表中的表结点*/

}vexnode;

typedefstruct/*邻接表结构*/

{

vexnodeadjs[maxlen];/*邻接表的头结点集合*/

intvexnum,arcnum;/*顶点数,边数*/

intkind;

}adjlist;

typedefstructqnode/*队列存储结构*/

{intdata;

structqnode*next;

}linkqlist;

typedefstruct

{linkqlist*front;/*队头指针*/

linkqlist*rear;/*队尾指针*/

}linkqueue;

typedefstruct/*栈结构*/

{intstack[maxlen];

inttop;

}stackstru;

intcnull=-1;

graphg;

adjlistadjl;

stackstru*t;/*拓扑序列顶点栈*/

stackstru*s;/*零入度顶点栈*/

linkqueue*q;

graphprintf_adjmatrix(graphg)/*输出邻接矩阵*/

{

inti,j;

printf("邻接矩阵:

\n");

printf("vertex\t");

for(i=0;i

printf("\n");

for(i=0;i

{printf("%4c\t",g.vexs[i]);

for(j=0;j

printf("\n");

}

returng;

}

voidcreate_1(graphg)

{

inti,j,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1