实验目的及要求:
目标是使学生学会分析数据对象的特点,掌握数据组织的方法和在计算机中的存储方式,能够对具体问题中所涉及的数据选择合适的逻辑结构、存储结构,进而在此基础上,对各种具体操作设计高效的算法,培养良好的程序设计技能。
实验设备环境:
1.微型计算机
2.DEV C++(或其他的编译软件)
实验步骤:
任务一:
编程实现如下任务: 建立一个线性表,首先依次输入元素 1,2,3,...,10,然后删除元素 5,最后依次显示当前线性表中的元素。假设该线性表的元素个数在最坏情况下不会超过 100 个。要求使用顺序表。
程序参数设计\] 因为该线性表元素在最坏情况下不会超过 100 个,所以定义顺序表的 MaxSize 为 100;因为该设计任务元素的数据类型为 int 类型,所以定义顺序表的 DataType 为 int 该任务要求的插入、删除、取元素等操作可通过调用顺序表的插入、删除、取元素等函数来实现。
代码如下:
```cpp
#include
#define MaxSize 100
typedef int DataType;
#include"SeqList.h"
int main(void){
SeqList myList;
int i,x;
ListInitiate(&myList);
for(i=0;i<10;i++)
ListInsert(&myList,i,i+1);
ListDelete(&myList,4,&x);
printf("顺序表中的元素:");
for(i=0;isize=0;
}
int ListLength(SeqList L){
return L.size;
}
int ListInsert(SeqList *L,int i,DataType x){
int j;
if(L->size>=MaxSize){
printf("顺序表已满无法插入!\n");
return 0;
}else if(i<0||i>L->size){
printf("参数i不合法!\n");
return 0;
}else{
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
L->list[i]=x;
L->size++;
return 1;
}
}
int ListDelete(SeqList*L,int i,DataType*x){
int j;
if(L->size<=0){
printf("顺序表已空无元素可删!\n");
return 0;
}else if(i<0||i>L->size-1){
printf("参数i不合法!\n");
return 0;
}else{
*x=L->list[i];
for(j=i+1;j<=L->size-1;j++)
L->list[j-1]=L->list[j];
L->size--;
return 1;
}
}
int ListGet(SeqList L,int i,DataType *x){
if(i<0||i>L.size-1){
printf("参数i不合法!\n");
return 0;
} else{
*x=L.list[i];
return 1;
}
}
```
任务二:
编程实现如下任务: 建立一个如表 2-1 所示的学生信息表,要求先依次输入元素,然后依次显示当前表中的元素。假设该表元素个数在最坏情况下不会超过100个。要求使用顺序表。
\[程序参数设计\] 因为该表元素个数在最坏情况下不会超过100个,所以定义顺序表的MaxSize为100;该设计任务要处理的元素为学生信息,从表2-1可知,每个学生信息元素包括学号、姓名、性别和年龄4个数据项。
代码如下:
```cpp
#include
#define MaxSize 100
typedef struct Student{
long number;
char name[10];
char sex[3];
int age;
}StudentType;
typedef StudentType DataType;
#include"SeqList.h"
int main(void){
SeqList myList;
int i;
StudentType x[3]={{2000001,"张三","男",20},
{2000002,"李四","男",21},
{2000003,"王五","女",22}};
StudentType s;
ListInitiate(&myList);
ListInsert(&myList,0,x[0]);
ListInsert(&myList,1,x[1]);
ListInsert(&myList,2,x[2]);
printf("学生信息如下:\n");
for(i=0;isize=0;
}
int ListLength(SeqList L){
return L.size;
}
int ListInsert(SeqList *L,int i,DataType x){
int j;
if(L->size>=MaxSize){
printf("顺序表已满无法插入!\n");
return 0;
}else if(i<0||i>L->size){
printf("参数i不合法!\n");
return 0;
}else{
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
L->list[i]=x;
L->size++;
return 1;
}
}
int ListDelete(SeqList*L,int i,DataType*x){
int j;
if(L->size<=0){
printf("顺序表已空无元素可删!\n");
return 0;
}else if(i<0||i>L->size-1){
printf("参数i不合法!\n");
return 0;
}else{
*x=L->list[i];
for(j=i+1;j<=L->size-1;j++)
L->list[j-1]=L->list[j];
L->size--;
return 1;
}
}
int ListGet(SeqList L,int i,DataType *x){
if(i<0||i>L.size-1){
printf("参数i不合法!\n");
return 0;
} else{
*x=L.list[i];
return 1;
}
}
```
任务三:
编程实现和例 2-1 相同的务,即建立一个线性表,首先依次输入元素 1,2.3,......,10,然后删除元素 5,最后依次显示当前表中的元素。要求使用单链表。
\[程序参数设计\] 因为该设计任务中元素的数据类型为 int 类型,所以定义单链表的DataType 为 int。单链表的插入、删除、取元素等操作均可通过调用单链表的插入、删除、取元素等操作来实现。
代码如下:
```cpp
#include
#include
typedef int DataType;
#include"LinList.h"
int main(void){
SLNode *head;
int i,x;
ListInitiate(&head);
for(i=0;i<10;i++){
ListInsert(head,i,i+1);
}
ListDelete(head,4,&x);
printf("链表中的元素:");
for(i=0;inext=NULL;
}
int ListLength(SLNode *head){
SLNode *p=head;
int size=0;
while(p->next!=NULL){
p=p->next;
size++;
}
return size;
}
int ListInsert(SLNode *head,int i,DataType x){
SLNode *p,*q;
int j;
p=head;
j=-1;
while(p->next!=NULL&&jnext;
j++;
}
if(j!=i-1){
printf("插入元素位置参数错!");
return 0;
}
q=(SLNode *)malloc(sizeof(SLNode));
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){
SLNode *p,*s;
int j;
p=head;
j=-1;
while(p->next!=NULL&&p->next->next!=NULL&&jnext;
j++;
}
if(j!=i-1){
printf("删除元素位置参数错!");
return 0;
}
s=p->next;
*x=s->data;
p->next=p->next->next;
free(s);
return 1;
}
int ListGet(SLNode *head,int i,DataType *x){
SLNode *p;
int j;
p=head;
j=-1;
while(p->next!=NULL&&jnext;
j++;
}
if(j!=i){
printf("取出元素位置参数错!");
return 0;
}
*x=p->data;
return 1;
}
void Destroy(SLNode **head){
SLNode *p,*p1;
p=*head;
while(p!=NULL){
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}
```