预备实验及第二次实验

|这个作业属于哪个课程 |https://edu.cnblogs.com/campus/qdu/DS2020|
|这个作业要求在哪里 |https://edu.cnblogs.com/campus/qdu/DS2020/homework/11213|
|这个作业的目标 |复习c语言中的函数,数组,指针,结构体与共用体|
|学号 |2018204291|
一、实验目的
1、复习C语言中函数、数组、指针、结构体与共用体等的概念。

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

二、实验预习
说明以下C语言中的概念

函数: C语言中一个函数(function)是一个可以从程序其它地方调用执行的语句块

数组: C语言支持一维数组和多维数组。如果一个数组的所有元素都不是数组,那么该数组称为一维数组。在C语言中使用数组必须先进行定义,一维数组的定义方式为:类型说明符; 数组名 ;[常量表达式]。

3、指针: 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。

4、结构体: 语言结构体定义:struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
结构体是C语言中聚合数据类型(aggregatedatatype)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

5、共用体: 在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。

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

include<stdio.h>
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 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

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

include<stdio.h>
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<N;i++)

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

for(i=0;i<N/2;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<N;i++)

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

return 0;
}

运行结果:
the original Array is:
0 1 2 3 4 5 6 7 8 9
the changed Array is:
9 8 7 6 5 4 3 2 1 0

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

include<stdio.h>
define M 3
define N 4
int main(){

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

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

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

      for(j=0;j<N;j++)

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

for(i=0;i<M;i++){ /输出矩阵/

      for(j=0;j<N;j++)

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

      printf("\n");

}

for(i=0;i<M;i++){

      k=0;

      for(j=1;j<N;j++)    /*找出第i行的最大值*/

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

                    k=j;

      for(j=0;j<M;j++)   /*判断第i行的最大值是否为该列的最小值*/

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

                    break;

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

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

}

return 0;
}
运行结果:
请输入二维数组的数据:
1 2 3 4 5 6 7
1 3 5 6 7 8 9
1 2 3 4
5 6 7 1
3 5 6 7

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

include<stdio.h>
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<a[0]+12;p++){

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

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

}

return 0;
}
运行结果:
1 3 5 7
9 11 13 15
17 19 21 23

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

include <stdio.h>
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<n;i++){ /输入n个人员的信息/

      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<n;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

运行结果:name age job class/officeWang,19,s 115 99061
Li,36,t 0 computer
四、实验小结:通过寻找素数的这个方程可以用以巩固c++的相关知识,并且对有关数组的程序方法有了一定的了解

|这个作业属于哪个课程 |https://edu.cnblogs.com/campus/qdu/DS2020|
|这个作业要求在哪里 |https://edu.cnblogs.com/campus/qdu/DS2020/homework/11232|
|这个作业的目标 |掌握顺序表和链表的相关知识|
|学号 |2018204291|
一、实验目的
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。

二、实验预习
说明以下概念
1、线性表:1、线性表是由n个数据元素(结点)a1,a2,.......an组成的有限序列。其中,数据元素的个数n定义为表的长度。当n=0时称为空表,常常将非空的线性表(n>0)记作(a1,a2.........an)

2、顺序表:用顺序存储的方式:即把线性表的结点按逻辑次序依次放在一组地址连续的存储单元里。用这种方法存储的线性表称为顺序表。

3、链表:用链接方式存储线性表,通常我们将链接方式存储的线性表称为链表

三、实验内容和要求
1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。

include<stdio.h>

include<malloc.h>

define ERROR 0

define OK 1

define INIT_SIZE 10 /初始分配的顺序表长度/

define INCREM 5 /溢出时,顺序表长度的增量/

typedef int ElemType; /定义表元素的类型/
typedef struct Sqlist{
ElemType slist; /存储空间的基地址/
int length; /
顺序表的当前长度/
int listsize; /
当前分配的存储空间*/
}Sqlist;

int InitList_sq(Sqlist L); /初始化顺序表/
int CreateList_sq(Sqlist L,int n); /创造长度为n的空顺序表
/
int ListInsert_sq(Sqlist L,int i,ElemType e);/在第i个位置插入值为e的元素/
int PrintList_sq(Sqlist L); /输出顺序表的元素
/
int ListDelete_sq(Sqlist L,int i); /删除第i个元素/
int ListLocate_sq(Sqlist L,ElemType e); /查找值为e的元素
/

int InitList_sq(Sqlist L){
L->slist=(ElemType
)malloc(INIT_SIZEsizeof(ElemType));
if(!L->slist) return ERROR;
L->length=0;
L->listsize=INIT_SIZE;
return OK;
}/
InitList*/

int CreateList_sq(Sqlist L,int n){
ElemType e;
int i;
for(i=0;i<n;i++){
printf("input data %d",i+1);
scanf("%d",&e);
if(!ListInsert_sq(L,i+1,e))
return ERROR;
}
return OK;
}/
CreateList*/

/输出顺序表中的元素/
int PrintList_sq(Sqlist L){
int i;
for(i=1;i<=L->length;i++)
printf("%5d",L->slist[i-1]);
return OK;
}/
PrintList*/

int ListInsert_sq(Sqlist L,int i,int e){
int k;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize){
L->slist=(ElemType
)realloc(L->slist,
(INIT_SIZE+INCREM)sizeof(ElemType));
if(!L->slist)
return ERROR;
L->listsize+=INCREM;
}
for(k=L->length-1;k>=i-1;k--){
L->slist[k+1]= L->slist[k];
}
L->slist[i-1]=e;
L->length++;
return OK;
}/
ListInsert*/

/在顺序表中删除第i个元素/
int ListDelete_sq(Sqlist L,int i){
if(L->length==0) return 0;
if(i<1||i>L->length) return 0;
for(int j;jlength;j++)
L->slist[j-1]=L->slist[j];
L->length--;
return 1;
}
/
在顺序表中查找指定值元素,返回其序号*/
int ListLocate_sq(Sqlist *L,ElemType e){
for(int i=1;i<=L->length;i++)
{
if(L->slist[i-1]==e) return 1;
return 0;
}
}

int main(){
Sqlist sl;
int n,m,e;
printf("please input n:"); /输入顺序表的元素个数/
scanf("%d",&n);
if(n>0){
printf("\n1-Create Sqlist:\n");
InitList_sq(&sl);
CreateList_sq(&sl,n);
printf("\n2-Print Sqlist:\n");
PrintList_sq(&sl);
printf("\nplease input insert location and data:(location,data)\n");
scanf("%d %d",&m,&e);
ListInsert_sq(&sl,m,e);
printf("\n3-Print Sqlist:\n");
PrintList_sq(&sl);
printf("\nplease input delate location:location\n");
scanf("%d",&m);
ListDelete_sq(&sl,m);
printf("\n4-Print Sqlist:\n");
PrintList_sq(&sl);
printf("\nplease input date:date\n");
scanf("%d",&m);
ListLocate_sq(&sl,m);
printf("\nSearch date is%d\n",ListLocate_sq(&sl,m));
printf("\n");
}
else
printf("ERROR");
return 0;
}
运行结果:
2 7 4 6
算法分析:在程序的开头进行顺序表各种函数的声明以及预命令,编写各种操作函数的函数体,进行插入操作,并输出插入新元素后的状态。
2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。
删除算法代码:

int ListDelete_sq(Sqlist *L,int i){
if(L->length==0) return 0;
if(i<1||i>L->length) return 0;
for(int j;jlength;j++)
L->slist[j-1]=L->slist[j];
L->length--;
return 1;
}
运行结果
2 7 4
算法分析:在删除函数中,当把顺序表和i值输入进去以后,可判度满不满足条件,若满足,则从顺序表的开始查找,直到找到第i个元素将其删除。

查找算法代码:

int ListLocate_sq(Sqlist *L,ElemType e){
for(int i=1;i<=L->length;i++)
{
if(L->slist[i-1]==e) return 1;
return 0;
}
}
运行结果:
Search date is1
算法分析:在主程序中查找函数并输入参数后,程序会从顺序表第一个元素开始查找,直到找到e元素的位置,并输出其位置。
3、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。

include<malloc.h>

include<stdio.h>

define ERROR 0

define OK 1

typedef int ElemType; /定义表元素的类型/
typedef struct LNode{ /线性表的单链表存储/
ElemType data;
struct LNode next;
}LNode,
LinkList;

LinkList CreateList(int n); /创造带表头节点的单链表/
void PrintList(LinkList L); /输出带头节点单链表的所有元素/
int GetElem(LinkList L,int i,ElemType e); /查询链表中第i个位置并且用元素e返回/
int InSertList(LinkList L,int i,ElemType);
int DeleteLIST(LinkList L,ElemType e);
LinkList CreateList(int n){
LNode p,q,
head;
int i;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
p=head;
for(i=0;i<n;i++){
q=(LinkList)malloc(sizeof(LNode));
printf("input data %i:",i+1);
scanf("%d",&q->data); /
输入元素值/
q->next=NULL; /
结点指针域置空/
p->next=q; /
新结点连在表末尾/
p=q;
}
return head;
}/
CreateList*/

void PrintList(LinkList L){
LNode p;
p=L->next; /
p指向单链表的第1个元素/
while(p!=NULL){
printf("%5d",p->data);
p=p->next;
}
}/
PrintList*/

int GetElem(LinkList L,int i,ElemType e){
LNode p;int j=1;
p=L->next;
while(p&&j<i){
p=p->next;j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}/
GetElem
/
int InSertList(LinkList L,int i,ElemType e){
int j=1;LNode p,q;p=L->next;
while(p&&j<i-1){
p=p->next;j=j++;
}
if(!p)
return ERROR;
q=(LNode
)malloc(sizeof(LNode));
q->data=e;q->next=p->next;p->next=q;
return OK;
}

int DeleteList(LinkList L,ElemType e){
LNode p,q;p=L->next;
while(p&&p->data!=e){
q=p;p=p->next;
}
if(!p)
return ERROR;
else
{
q->next=p->next;
free(p);
return OK;
}
}
int main(){
int n,i;ElemType e;
LinkList L=NULL; /定义指向单链表的指针/
printf("please input n:"); /输入单链表的元素个数/
scanf("%d",&n);
if(n>0){
printf("\n1-Create LinkList:\n");
L=CreateList(n);
printf("\n2-Print LinkList:\n");
PrintList(L);
printf("\n3-GetElem from LinkList:\n");
printf("input i=");
scanf("%d",&i);
if(GetElem(L,i,&e))
printf("No%i is %d",i,e);
else
printf("not exists");
printf("\n4-InSert from LinkList:\n");
printf("input i=");
scanf("%d",&i);
printf("input e=");
scanf("%d",&e);
InSertList(L,i,e);
PrintList(L);
printf("\n5-Delete from LinkList:\n");
printf("input e=");
scanf("%d",&e);
DeleteList(L,e);
PrintList(L);
printf("\n");
}else
printf("ERROR");
return 0;
}
运行结果:
input i=2
No2 is 4
算法分析:在程序的开头进行顺序表各种操作函数的声明以及预命令,编写各种操作函数的函数体,而在主函数中创建带头结点的单链表,输入结点数,依次输入各个结点的值,调用查找功能函数,输入查找元素的位置,输出对应元素的值。调用插入功能函数,输出插入后的新链表。调用删除功能函数,输入要删除的元素值,最后输出删除后的新单链表
4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。
插入算法代码:

int InSertList(LinkList L,int i,ElemType e){
int j=1;LNode p,q;p=L->next;
while(p&&j<i-1){
p=p->next;j=j++;
}
if(!p)
return ERROR;
q=(LNode*)malloc(sizeof(LNode));
q->data=e;q->next=p->next;p->next=q;
return OK;
}
运行结果:
input i=1
input e=3
5 3 4 7
算法分析:在主函数里面调用查找功能函数,当把单链表,要插入的位置序号和元素内容传值进去时,程序开始从单链表第一个元素开始依次遍历,直到找到插入位置的前一个节点,用指针p指向它。然后创建一个以e为值的新节点指针q,修改节点q的next域指向节点p的下一个节点,再将节点p的next域修改为指向新节点s,输出插入后的新链表。

删除算法代码:

int DeleteList(LinkList L,ElemType e){
LNode p,q;p=L->next;
while(p&&p->data!=e){
q=p;p=p->next;
}
if(!p)
return ERROR;
else
{
q->next=p->next;
free(p);
return OK;
}
}
运行结果:
input e=7
5 3 4
算法分析:在主函数里面调用删除功能函数,当把单链表,要删除的元素内容传值进去时,程序开始从单链表第一个元素开始依次遍历,直到找到删除位置的前一个节点,用指针p指向它。指针q指向要删除的节点。然后修改指针p的next域为指向待删除节点*q的后继节点,输出删除后的新链表。
四实验小结:通过本次实验初步了解了顺序表及链表的不同,并了解了其中的部分数据操作例如元素的查找,插入,删除

posted @ 2020-10-08 18:47  郭超帝  阅读(210)  评论(0)    收藏  举报