q=p->next;if(p->dd){t=p->d;p->d=q->d;q->d=t;}
p=p->next;}}}
voidcaozuo(structnode*head)//操作界面
{intm,n;chart;
printf(输入你要的操作:
,查找2,插入3,删除\n);scanf(%c,&t);switch(t){case'1':
{printf(输入你要查找的元素的值:
\n);scanf(%d,&m);locate(head,m);}break;
case'2':
{printf(输入你要插入的元素的值和位置:
\n);
5
scanf(%d,&m);scanf(%d,&n);
insert(head,m,n);pre(head);}break;case'3':
{printf(输入你要删除的元素的位置:
\n);scanf(%d,&m);delet(head,m);pre(head);}break;
default:
printf(error\n);
}}
voidmain()//主函数
{charfrag='y',n=NULL;
printf(输入你要建立的第A链表中的元素:
\n);head1=creat();
printf(输入你要建立的第B链表中的元素:
\n);head2=creat();do
{printf(选择你要操作的链表A/B或者合并排序操作C:
\n);//选择操作
scanf(%c,&n);getchar();
switch(n){case'A':
{caozuo(head1);}break;case'B':
{caozuo(head2);}break;
case'C':
{hebing(head1,head2);paixu(head1);pre(head1);}break;default:
printf(error\n);
}
printf(\n是否继续y/n:
\n);scanf(%c,&frag);getchar();}while(frag=='y');
}
6
实验2栈和队列的基本操作
一、实验目的与基本要求
1.掌握栈和队列的顺序存储和链式存储结构
2.掌握栈和队列的特点。
3.掌握栈和队列的基本运算。
二、实验条件
1.硬件:
一台微型计算机
2.软件:
操作系统和C语言系统。
三、实验方法
确定存储结构后,上机调试实现栈和队列的基本运算。
四、实验内容
1.写出栈的入栈和出栈的算法
2.写出队列的入队和出队算法。
实验代码:
#includestdlib.h#includestdio.h
structnode{intd;
structnode*next;};
intnum;structnode*head;
voidpre(){structnode*p;
printf(链表中的数据为:
\n);
p=head;while(p!
=NULL){
printf(],p->d);p=p->next;
7
}
printf(\n);}
voidcreat(){structnode*p,*q;intx;
printf(输入你要储存的数据,输入负数作为结束:
\n);head=NULL;q=NULL;scanf(%d,&x);while(x>0){num++;
p=(structnode*)malloc(sizeof(structnode));p->d=x;p->next=NULL;
if(head==NULL)head=p;elseq->next=p;q=p;
scanf(%d,&x);getchar();}pre();
}
voidinsert(intx,inti){structnode*p,*q;p=head;intj=1;
q=(structnode*)malloc(sizeof(structnode));q->d=x;if(i==1)
{q->next=head;head=q;}else{
while((jnext!
=NULL)){j++;p=p->next;}q->next=p->next;
8
p->next=q;}}
voiddelet(inti){structnode*p,*q;p=head;intj=1;
if(i<0)printf(无此位置);
if(i==1)
{q=head;head=head->next;free(q);}else{
while((jnext!
=NULL)){p=p->next;j++;}q=p->next;
p->next=q->next;free(q);}
}
voidpush(){intn;num++;
printf(请输入数据:
);scanf(%d,&n);getchar();insert(n,num);pre();
}
voidpop(){delet(num);num--;pre();}
voidrudui(){intn;
num++;
9
printf(请输入数据:
);scanf(%d,&n);getchar();insert(n,1);pre();}
voidchudui(){delet(num);num--;pre();
}
voidmain(){charfrag='y';intn;creat();do
{printf(选择你要的操作入栈出栈入队出队:
\n);scanf(%d,&n);getchar();switch(n){case1:
{printf(入栈操作);push();printf(\n);}break;case2:
{
printf(出栈操作);pop();printf(\n);}break;case3:
{printf(入队操作);
rudui();printf(\n);}break;case4:
{printf(出队操作);
chudui();printf(\n);}break;default:
printf(error\n);
}
printf(\n是否继续y/n:
\n);scanf(%c,&frag);getchar();}while(frag=='y');
10
}
实验3二叉树的构造
一、实验目的与基本要求
熟练掌握二叉树的构造方法。
二、实验条件
1.硬件:
微机
2.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试二叉树的构造方法。
四、实验内容
设计一个读入一串整数构成一棵二叉树的程序。
(深度至少为2)
实验代码:
#include#include
structbtnode//二叉树结构体
{chard;
structbtnode*lchild;structbtnode*rchild;
};
structbtnode*creatbt(structbtnode*bt,intk)//建立二叉树
{structbtnode*p,*t;
t=(structbtnode*)malloc(sizeof(structbtnode));printf(输入元素(输入时结束所在分枝):
);charb;scanf(%c,&b);getchar();if(b!
='0'){p=(structbtnode*)malloc(sizeof(structbtnode));p->d=b;p->lchild=NULL;p->rchild=NULL;
11
if(k==0)t=p;
if(k==1)bt->lchild=p;if(k==2)bt->rchild=p;creatbt(p,1);creatbt(p,2);
}
returnt;
}
voidpretrav(structbtnode*bt)//前序遍历
{if(bt!
=NULL){printf(%c\n,bt->d);pretrav(bt->lchild);pretrav(bt->rchild);
}return;
}
voidintrav(structbtnode*bt)//中序遍历
{if(bt!
=NULL){intrav(bt->lchild);printf(%c\n,bt->d);intrav(bt->rchild);}return;
}
voidpostrav(structbtnode*bt)//后序遍历
{if(bt!
=NULL){postrav(bt->lchild);postrav(bt->rchild);printf(%c\n,bt->d);}return;
}
intmain(){structbtnode*m;charfrag='y';
12
ints;do{printf(请选择\n1、建立二叉树\n2、前序遍历\n3、中序遍历\n4、后序遍历\n5、退出\n);scanf(%d,&s);getchar();switch(s){case1:
m=creatbt(0,0);break;case2:
pretrav(m);break;case3:
intrav(m);break;case4:
postrav(m);break;default:
{printf(是否继续\ny/n);scanf(%c,&frag);getchar();
};break;
}
}while(frag=='y');
}
13
实验4排序的基本操作
一、实验目的与基本要求
1.掌握常用的排序方法,并用高级语言实现排序算法。
2.理解排序的定义和各种排序的特点。
3.了解排序过程以及依据的原则,并了解各种排序方法的时间复杂度分析。
二、实验条件
1.硬件:
一台微机
2.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试不同的排序方法。
四、实验内容
1.设计一待排序的线性表以顺序存储结构存储,试写出冒泡排序算法。
2.给出n个学生的考试成绩表,每条信息由姓名与分数组成,试设计一个算法:
(1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。
(2)按名次列出每个学生的姓名与分数。
实验代码:
#includestdlib.h#includestdio.h
structnode//结构体变量
{intf;intm;charn;
structnode*next;};
voidpre(structnode*head)//打印数据
14
{structnode*p;printf(链表中的数据为:
\n);printf(名次姓名分数\n);
p=head;while(p!
=NULL){
printf(],p->m);printf(\,p->n);printf(],p->f);printf(\n);p=p->next;
}
printf(\n);}
intnum;
structnode*creat()//建立数据
{structnode*head,*q,*p;intx,y,j;charz;
printf(输入录入学生的人数:
\n);head=NULL;q=NULL;
scanf(%d,&num);getchar();for(j=0;j\n);scanf(%c,&z);getchar();
printf(输入学生的分数:
\n);scanf(%d,&x);
getchar();
p=(structnode*)malloc(sizeof(structnode));p->n=z;p->f=x;p->m=0;p->next=NULL;
if(head==NULL)head=p;elseq->next=p;q=p;
15
}
pre(head);return(head);}
structnode*paixu(structnode*head)//按分数排序
{
inti,j;structnode*q,*p,*k,*t;
t=(structnode*)malloc(sizeof(structnode));t->next=head;for(i=num-1;i>0;i--){q=t;
for(j=0;j
p=q->next;k=p->next;
if(k->f>p->f){p->next=k->next;q->next=k;k->next=p;
}
q=q->next;
}
}
q=t->next;j=0;q->m=1;
for(i=1;i{p=q->next;
if(q->f==p->f){p->m=q->m;}
16
elsep->m=q->m+1;q=q->next;}return(t->next);
}
voidmain(){
structnode*head,*m;head=creat();m=paixu(head);
printf(按名次排序后);pre(m);getchar();}