数 据 结 构(C语言版) 实 验 指 导包含参考程序

数 据 结 构(C语言版) 实 验 指 导包含参考程序
数 据 结 构(C语言版) 实 验 指 导包含参考程序

数据结构(C语言版)实验指导

预备实验C语言的函数、数组、指针和结构体知识

一、实验目的

1、复习C语言中函数、数组、指针、结构体与共用体等的概念。

2、熟悉利用C语言进行程序设计的一般方法。

二、实验内容

1、调试程序:输出100以内所有的素数(用函数实现)。

#include

int isprime(int n){ /*判断一个数是否为素数*/

int m;

for(m=2;m*m<=n;m++)

if(n%m==0) return 0;

return 1;

}

int main(){ /*输出100以内所有素数*/

int i; printf("\n");

for(i=2;i<100;i++)

if(isprime(i)==1) printf("%4d",i);

return 0;

}

运行结果:

2、调试程序:对一维数组中的元素进行逆序排列。

#include

#define N 10

int main(){

int a[N]={0,1,2,3,4,5,6,7,8,9},i,temp;

printf("\nthe original Array is:\n ");

for(i=0;i

printf("%4d",a[i]);

for(i=0;i

temp=a[i];

a[i]=a[N-i-1];

a[N-i-1]=temp;

}

printf("\nthe changed Array is:\n");

for(i=0;i

printf("%4d",a[i]);

return 0;

}

运行结果:

3、调试程序:在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。

#include

#define M 3

#define N 4

int main(){

int a[M][N],i,j,k;

printf("\n请输入二维数组的数据:\n");

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

for(j=0;j

printf("%4d",a[i][j]);

printf("\n");

}

for(i=0;i

k=0;

for(j=1;j

if(a[i][j]>a[i][k])

k=j;

for(j=0;j

break;

if(j==M) /*在第i行找到鞍点*/

printf("%d,%d,%d\n",a[i][k],i,k);

}

return 0;

}

运行结果:

4、调试程序:利用指针输出二维数组的元素。

#include

int main(){

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int *p;

for(p=a[0];p

if((p-a[0])%4==0) printf("\n");

printf("%4d",*p);

}

return 0;

}

运行结果:

5、调试程序:设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。

#include

#define N 10

struct student{

char name[8]; /*姓名*/

int age; /*年龄*/

char job; /*职业或专业,用s或t表示学生或教师*/

union {

int class; /*班级*/

char office[10]; /*教研室*/

}depa;

}stu[N];

int main(){

int i; int n;

printf(“\n请输入人员数(<10):\n”);

scanf(“%d”,&n);

for(i=0;i

printf("\n请输入第%d人员的信息:(name age job class/office)\n",i+1);

scanf("%s,%d,%c",stu[i].name, &stu[i].age, &stu[i].job);

if(stu[i].job==’s’)

scanf("%d",&stu[i].depa.class);

else

scanf("%s",stu[i].depa.office);

}

printf(“name age job class/office”);

for(i=0;i

if(stu[i].job==’s’)

printf("%s %3d %3c %d\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.class);

else

printf("%s %3d %3c %s\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.office);

}

}

输入的数据:2

Wang 19 s 99061

Li 36 t computer

实验一线性表及其应用

一、实验目的

1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。

2.掌握线性表的顺序存储结构的定义及C语言实现。

3.掌握线性表的链式存储结构——单链表的定义及C语言实现。

4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。

5.掌握线性表在链式存储结构——单链表中的各种基本操作。

二、实验内容

1.顺序线性表的建立、插入及删除。

2.链式线性表的建立、插入及删除。

三、实验步骤

1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。

3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。

四、实现提示

1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。

在此,我们利用C语言的结构体类型定义顺序表:

#define MAXSIZE 1024

typedef int elemtype; /* 线性表中存放整型元素*/

typedef struct

{ elemtype vec[MAXSIZE];

int len; /* 顺序表的长度*/

}sequenlist;

将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。

2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。

3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下:

typedef int elemtype;

typedef struct node

{ elemtype data; //数据域

struct node *next; //指针域

}linklist;

注意结点的建立方法及构造新结点时指针的变化。构造一个结点需用到C语言的标准函数malloc(),如给指针变量p分配一个结点的地址:

p=(linklist *)malloc(sizeof(linklist));该语句的功能是申请分配一个类型为linklist的结点的地址空间,并将首地址存入指针变量p 中。当结点不需要时可以用标准函数free(p)释放结点存储空间,这时p为空值(NULL)。

五、思考与提高

1. 如果按由表尾至表头的次序输入数据元素,应如何建立顺序表。

2. 在main函数里如果去掉L=&a语句,会出现什么结果?

六、参考程序

1.顺序线性表的建立、插入及删除。

#include

#include

#define MAX 30 //定义线性表的最大长度

enum BOOL{False,True}; //定义BOOL型

typedef struct{

char elem[MAX]; //线性表

int last; //last指示当前线性表的长度

}sqlist;

void initial(sqlist &); //初始化线性表

BOOL insert(sqlist &,int,char); //在线性表中插入元素

BOOL del(sqlist&,int,char &); //在线性表中删除元素

int locate(sqlist,char); //在线性表中定位元素

void print(sqlist); //显示线性表中所有元素

void main()

{sqlist S; //S为一线性表

int loc,flag=1;

char j,ch;

BOOL temp;

printf("本程序用来实现顺序结构的线性表。\n");

printf("可以实现查找、插入、删除等操作。\n");

initial(S); //初始化线性表

while(flag)

{ printf("请选择:\n");

printf("1.显示所有元素\n");

printf("2.插入一个元素\n");

printf("3.删除一个元素\n");

printf("4.查找一个元素\n");

printf("5.退出程序\n");

scanf(" %c",&j);

switch(j)

{case '1':print(S); break; //显示所有元素

case '2':{printf("请输入要插入的元素(一个字符)和插入位置:\n");

printf("格式:字符,位置;例如:a,2\n");

scanf(" %c,%d",&ch,&loc); //输入要插入的元素和插入的位置

temp=insert(S,loc,ch); //插入

if(temp==False) printf("插入失败!\n"); //插入失败

else {printf("插入成功!\n"); print(S);} //插入成功break;

}

case '3':{printf("请输入要删除元素的位置:");

scanf("%d",&loc); //输入要删除的元素的位置

temp=del(S,loc,ch); //删除

if(temp==True) printf("删除了一个元素:%c\n",ch); //删除成功

else printf("该元素不存在!\n"); //删除失败

print(S);

break;

}

case '4':{printf("请输入要查找的元素:");

scanf(" %c",&ch); //输入要查找的元素

loc=locate(S,ch); //定位

if(loc!=-1) printf("该元素所在位置:%d\n",loc+1); //显示该元素位置

else printf("%c 不存在!\n",ch);//当前元素不存在

break;

}

default:flag=0;printf("程序结束,按任意键退出!\n");

}

}

getch();

}

void initial(sqlist &v)

{//初始化线性表

int i;

printf("请输入初始线性表长度:n="); //输入线性表初始化时的长度

scanf("%d",&https://www.360docs.net/doc/874491987.html,st);

printf("请输入从1到%d的各元素(字符),例如:abcdefg\n",https://www.360docs.net/doc/874491987.html,st);

getchar();

for(i=0;i

}

BOOL insert(sqlist &v,int loc,char ch)

{//插入一个元素,成功返回True,失败返回False

int i;

if((loc<1)||(loc>https://www.360docs.net/doc/874491987.html,st+1))

{printf("插入位置不合理!\n"); //位置不合理

return False;

}

else if(https://www.360docs.net/doc/874491987.html,st>=MAX) //线性表已满

{printf("线性表已满!\n");

return False;

}

else {for(i=https://www.360docs.net/doc/874491987.html,st-1;i>=loc-1;i--) v.elem[i+1]=v.elem[i];//其后元素依次后移v.elem[loc-1]=ch; //插入元素

https://www.360docs.net/doc/874491987.html,st++; //线性表长度加一

return True;

}

}

BOOL del(sqlist &v,int loc,char &ch)

{//删除一个元素,成功返回True,并用ch返回该元素值,失败返回False int j;

if(loc<1||loc>https://www.360docs.net/doc/874491987.html,st) //删除位置不合理

return False;

else {ch=v.elem[loc-1]; //ch取得该元素值

for(j=loc-1;j

https://www.360docs.net/doc/874491987.html,st--; //线性表长度减一

return True;

}

int locate(sqlist v,char ch)

{//在线性表中查找ch的位置,成功返回其位置,失败返回-1

int i=0;

while(i

return i;

else return(-1);

}

void print(sqlist v) //显示当前线性表所有元素

{int i;

for(i=0;i

printf("\n");

}

2.链式线性表的建立、插入及删除。

#include

#include

#include

#define LEN sizeof(LNode) //定义LEN为一个节点的长度

enum BOOL{False,True}; //定义BOOL型

typedef struct node

{char data; //数据域

struct node *next;//指向下一个节点的指针

}LNode,*LinkList;

void CreatList(LinkList &,int); //生成一个单链表

BOOL ListInsert(LinkList &,int,char); //在单链表中插入一个元素BOOL ListDelete(LinkList &,int,char &); //在单链表中删除一个元素BOOL ListFind_keyword(LinkList,char,int &); //按关键字查找一个元素

BOOL ListFind_order(LinkList,char &,int); //按序号查找一个元素

void ListPrint(LinkList); //显示单链表所有元素

void main()

{LinkList L;

BOOL temp;

int num,loc,flag=1;

char j,ch;

printf("本程序实现链式结构的线性表的操作。\n");

printf("可以进行插入,删除,定位,查找等操作。\n");

printf("请输入初始时链表长度:"); //输入生成单链表时的元素个数

scanf("%d",&num);

CreatList(L,num); //生成单链表

ListPrint(L);

while(flag)

{ printf("请选择:\n");

printf("1.显示所有元素\n"); //显示链表元素

printf("2.插入一个元素\n"); //插入链表元素

printf("3.删除一个元素\n"); //删除链表元素

printf("4.按关键字查找元素\n"); //按关键字查找

printf("5.按序号查找元素\n"); //按序号查找

printf("6.退出程序\n"); //退出

scanf(" %c",&j);

switch(j)

{case '1':ListPrint(L); break;

case '2':{printf("请输入元素(一个字符)和要插入的位置:\n");

printf("格式:字符,位置;例如:a,3\n");

scanf(" %c,%d",&ch,&loc); //输入要插入的元素和要插入的位置

temp=ListInsert(L,loc,ch); //插入

if(temp==False) printf("插入失败!\n"); //插入失败

else printf("插入成功!\n"); //成功插入

ListPrint(L);

break;

}

case '3':printf("请输入要删除的元素所在位置:");

scanf("%d",&loc); //输入要删除的节点的位置

temp=ListDelete(L,loc,ch); //删除

if(temp==False) printf("删除失败!\n"); //删除失败

else printf("成功删除了一个元素:%c\n",ch); //删除成功,显示该元素

ListPrint(L);

break;

case '4':if(L->next==NULL) //链表为空

printf("链表为空!\n");

else{printf("请输入要查找的元素(一个字符):");

scanf(" %c",&ch); //输入要查找的元素

temp=ListFind_keyword(L,ch,loc); //按关键字查找

if(temp==False) printf("没有找到该元素!\n"); //查找失败

else printf("该元素在链表的第%d个位置。\n",loc);

//成功查找,显示该元素位置

}

break;

case '5':if(L->next==NULL) //链表为空

printf("链表为空!\n");

else{printf("请输入要查找的位置:");

scanf("%d",&loc); //输入要查找的元素的位置

temp=ListFind_order(L,ch,loc); //按序号查找

if(temp==False) printf("该位置不存在!\n"); //查找失败

else printf("第%d个元素是:%c\n",loc,ch);

//成功查找,显示该元素

}

break;

default:flag=0;printf("程序结束,按任意键退出!\n");

}

}

getch();

}

void CreatList(LinkList &v,int n)

{//生成一个带头结点的有n个元素的单链表

int i;

LinkList p;

v=(LinkList)malloc(LEN); //生成头结点

v->next=NULL;

printf("请输入%d个字符:例如:abcdefg\n",n);

getchar();

for(i=n;i>0;--i)

{p=(LinkList)malloc(LEN); //生成新结点

scanf("%c",&p->data);

p->next=v->next;

v->next=p;

}

}

BOOL ListInsert(LinkList &v,int i,char e)

{//在单链表的第i各位置插入元素e,成功返回True,失败返回False LinkList p,s;

int j=0;

p=v;

while(p&&jnext;++j;} //查找第i-1个元素的位置

if(!p||j>i-1) return False; //没有找到

s=(LinkList)malloc(LEN); //生成一个新结点

s->data=e;

s->next=p->next; //将新结点插入到单链表中

p->next=s;

return True;

}

BOOL ListDelete(LinkList &v,int i,char &e)

{//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False

LinkList p,q;

int j=0;

p=v;

while(p->next&&j

{p=p->next;++j;}

if(!(p->next)||j>i-1) return False; //查找失败

q=p->next;p->next=q->next; //删除该元素

e=q->data; //e取得该元素值

free(q); //释放该元素空间

return True;

}

BOOL ListFind_keyword(LinkList v,char e,int &i)

{//在单链表中查找关键字为e的元素,成功返回True,并用i返回该元素位置,//失败返回False

i=1;

LinkList p;

p=v->next;

while((p->data!=e)&&(p->next!=NULL))//p指针指向下一个,直到{p=p->next; i++;} //找到或到链表尾为止if(p->data!=e) //该元素在链表中不存在return False;

else return True;

}

BOOL ListFind_order(LinkList v,char &e,int i)

{//在单链表中查找第i个元素,成功返回True,并用e返回该元素值,//失败返回False

LinkList p;

int j=0;

p=v;

while(p->next&&j

{p=p->next;++j;}

if(j!=i) return False; //查找失败

else {e=p->data; //查找成功,用e取得该元素值

return True;

}

}

void ListPrint(LinkList v)

{//显示链表所有元素

LinkList q;

q=v->next;

printf("链表所有元素:");

while(q!=NULL)

{printf("%c ",q->data);q=q->next;}

printf("\n");

}

实验二栈和队列

一、实验目的

1. 掌握栈的顺序表示和实现

2. 掌握队列的链式表示和实现

二、实验内容

1. 编写一个程序实现顺序栈的各种基本运算。

2. 实现队列的链式表示和实现。

三、实验步骤

1. 初始化顺序栈

2. 插入元素

3. 删除栈顶元素

4. 取栈顶元素

5. 遍历顺序栈

6. 置空顺序栈

7. 初始化并建立链队列

8. 入链队列

9. 出链队列

10. 遍历链队列

四、实现提示

1. /*定义顺序栈的存储结构*/

typedef struct {

ElemType stack[MAXNUM];

int top;

}SqStack;

/*初始化顺序栈函数*/

void InitStack(SqStack *p)

{q=(SqStack*)malloc(sizeof(SqStack) /*申请空间*/)

/*入栈函数*/

void Push(SqStack *p,ElemType x)

{if(p->top

{p->top=p->top+1; /*栈顶+1*/

p->stack[p->top]=x; } /*数据入栈*/

}

/*出栈函数*/

ElemType Pop(SqStack *p)

{x=p->stack[p->top]; /*将栈顶元素赋给x*/

p->top=p->top-1; } /*栈顶-1*/

/*获取栈顶元素函数*/

ElemType GetTop(SqStack *p)

{ x=p->stack[p->top];}

/*遍历顺序栈函数*/

void OutStack(SqStack *p)

{ for(i=p->top;i>=0;i--)

printf("第%d个数据元素是:%6d\n",i,p->stack[i]);} /*置空顺序栈函数*/

void setEmpty(SqStack *p)

{ p->top= -1;}

2. /*定义链队列*/

typedef struct Qnode

{ ElemType data;

struct Qnode *next;

}Qnodetype;

typedef struct

{ Qnodetype *front;

Qnodetype *rear;

}Lqueue;

/*初始化并建立链队列函数*/

void creat(Lqueue *q)

{ h=(Qnodetype*)malloc(sizeof(Qnodetype)); /*初始化申请空间*/ h->next=NULL;

q->front=h;

q->rear=h;

for(i=1;i<=n;i++)*利用循环快速输入数据*/

{ scanf("%d",&x);

Lappend(q,x);} /*利用入链队列函数快速输入数据*/

}

/*入链队列函数*/

void Lappend(Lqueue *q,int x)

{ s->data=x;

s->next=NULL;

q->rear->next=s;

q->rear=s;}

/*出链队列函数*/

ElemType Ldelete(Lqueue *q)

{ p=q->front->next;

q->front->next=p->next;

if(p->next==NULL)

q->rear=q->front;

x=p->data;

free(p);} /*释放空间*/

/*遍历链队列函数*/

void display(Lqueue *q)

{ while(p!=NULL) /*利用条件判断是否到队尾*/

{ printf("%d-->",p->data);

p=p->next;

}

相关主题
相关文档
最新文档