實(shí)驗(yàn)一 ?順序表基本操作的實(shí)現(xiàn)
一、實(shí)驗(yàn)?zāi)康?/h3>
1.掌握線性表的順序存貯結(jié)構(gòu)及基本操作,深入了解順序表的基本特性,以便在實(shí)際問題背景下靈活運(yùn)用它們。
2.深入理解和靈活掌握順序表的插入、刪除等操作。
二、實(shí)驗(yàn)環(huán)境
1.硬件:每個學(xué)生需配備計(jì)算機(jī)一臺。
2.軟件:Windows操作系統(tǒng)+Visual C++。
三、實(shí)驗(yàn)要求
????1.將建表、遍歷、插入、刪除分別定義為4個子函數(shù),通過主函數(shù)實(shí)現(xiàn)對上述子函數(shù)的調(diào)用。
2.輸入數(shù)據(jù):數(shù)據(jù)類型設(shè)定為整型
四、實(shí)驗(yàn)內(nèi)容
實(shí)現(xiàn)順序表各種基本運(yùn)算的基礎(chǔ)上,設(shè)計(jì)主程序,完成如下功能:
(1)初始化順序表L。
(2)依次插入2,5,7,9,10共5個元素。
(3)輸出順序表L。
(4)輸出順序表L的長度。
(5)判斷順序表L是否為空。
(6)輸出順序表L第4個元素。
(7)輸出元素5的位置。
(8)在第4個元素的位置上插入元素100。
(9)輸出順序表L。
(10)刪除順序表L的第3個元素。
(11)輸出順序表L。
(12)釋放順序表L。
實(shí)現(xiàn)程序:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
//定義順序表
typedef struct{
ElemType data[MaxSize]; //存放順序表元素
int length; //存放順序表的長度
}SqList; //聲明順序表的類型
//創(chuàng)建順序表
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n)
{
L->data[k]=a[i];
k++;
i++;
}
L->length=k;
}
//初始化線性表
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//銷毀線性表
void DestroyList(SqList *&L){
free(L);
}
//判斷線性表是否為空表
bool ListEmpty(SqList *L){
return(L->length==0);
}
//求線性表的長度
int ListLength(SqList *L){
return(L->length);
}
//輸出順序表
void DispList(SqList *L)
{
for(int i=0;i<L->length;i++)
{
printf("%d",L->data[i]);
}
}
//求線性表的第i個元素
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
//查找第一個值為e的元素值
int LocateElem(SqList *L,ElemType e)
{
int i=0;
while(i<L->length && L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
//插入第i個元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-i];
L->data[i]=e;
L->length++;
return true;
}
//刪除第i個元素
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if(i<1 || i>L->length)
return false;
i--;
e=L->data[i];
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
void main()
{
SqList *L;
ElemType e;
printf("順序表的基本運(yùn)算如下:\n");
printf("(1)初始化順序表L\n");InitList(L);
printf("(2)依次插入2,5,7,9,10\n");
int i,y;
char s;
//循環(huán)輸入,遇到回車停止輸入
for(i=1;i<51&&s!='\n';i++){
scanf("%d",&y);
s=getchar();
ListInsert(L,i,y);
}
printf("(3)輸出順序表L");DispList(L);
printf("\n(4)輸出順序表L長度:%d\n",ListLength(L));
printf("(5)順序表L為%s\n",(ListEmpty(L)?"空":"非空"));
GetElem(L,3,e);
printf("(6)順序表L的第3個元素:%d\n",e);
printf("(7)元素5的位置:%d\n",LocateElem(L,5));
printf("(8)在第4個元素位置上插入100");ListInsert(L,4,100);
printf("\n(9)輸出順序列表L:");
DispList(L);
printf("\n(10)刪除L的第3個元素\n");
ListDelete(L,3,e);
printf("(11)輸出順序表L:");
DispList(L);
printf("\n(12)釋放順序表L\n");
DestroyList(L);
}
運(yùn)行結(jié)果:
測試結(jié)果:
通過!文章來源:http://www.zghlxwxcb.cn/news/detail-724358.html
2.順序表的應(yīng)用
(1)設(shè)計(jì)算法,刪除順序表中所有值等于x的元素。
實(shí)現(xiàn)程序:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
//定義順序表
typedef struct{
ElemType data[MaxSize]; //存放順序表元素
int length; //存放順序表的長度
}SqList; //聲明順序表的類型
//創(chuàng)建順序表
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n)
{
L->data[k]=a[i];
k++;
i++;
}
L->length=k;
}
//初始化線性表
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//銷毀線性表
void DestroyList(SqList *&L){
free(L);
}
//輸出順序表
void DispList(SqList *L)
{
for(int i=0;i<L->length;i++)
{
printf("%d",L->data[i]);
}
}
//插入第i個元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-i];
L->data[i]=e;
L->length++;
return true;
}
//順序表的刪除
bool Delete(SqList *&L,int a)
{
int k=0;
for(int i=0;i<L->length ;i++)
{
if(L->data[i]==a)//當(dāng)前元素為a時k增1
{
k++;
}
else
{
L->data [i-k]=L->data [i];//當(dāng)前元素不a時將其前移k個位置
}
}
L->length -= k;//順序表L的長度減K
return true;
}
void main()
{
SqList *L;
InitList(L);
printf("請輸入順序表用空格分開按回車結(jié)束\n");
int i,y;
char s;
for(i=1;i<51&&s!='\n';i++){
scanf("%d",&y);
s=getchar();
ListInsert(L,i,y);
}
printf("輸出順序表L");DispList(L);
printf("\n請輸入刪除元素:\n");
int a;
scanf("%d",&a);
Delete(L,a);
printf("輸出順序表L\n");
DispList(L);
}
運(yùn)行結(jié)果:
測試結(jié)果:
通過!
(2)設(shè)計(jì)算法,將順序表L中所有奇數(shù)移動到偶數(shù)的前面。
實(shí)現(xiàn)程序:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
//定義順序表
typedef struct{
ElemType data[MaxSize]; //存放順序表元素
int length; //存放順序表的長度
}SqList; //聲明順序表的類型
//創(chuàng)建順序表
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n)
{
L->data[k]=a[i];
k++;
i++;
}
L->length=k;
}
//初始化線性表
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//銷毀線性表
void DestroyList(SqList *&L){
free(L);
}
//插入第i個元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-i];
L->data[i]=e;
L->length++;
return true;
}
//輸出順序表
void DispList(SqList *L)
{
int i,b;
int a=0;
int j=L->length-1;
while(a<j){
while((j>=0)&&(L->data[j]%2==0))
j--;
while((a<j)&&(L->data[a]%2==1))
a++;
if(a<j){
b=L->data[j];
L->data[j]=L->data[a];
L->data[a]=b;
}
}
for(i=0;i<L->length;i++){
printf("%d",L->data[i]);
}
}
void main()
{
SqList *L;
InitList(L);
printf("請輸入順序表用空格分開按回車結(jié)束\n");
int i,y;
char s;
for(i=1;i<51&&s!='\n';i++){
scanf("%d",&y);
s=getchar();
ListInsert(L,i,y);
}
printf("輸出順序表L");
DispList(L);
printf("\n");
DestroyList(L);
}
運(yùn)行結(jié)果:
測試結(jié)果:
通過!
五、思考題
1.刪除順序表中自第i個元素起連續(xù)k個元素。
程序?qū)崿F(xiàn):
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
//定義順序表
typedef struct{
ElemType data[MaxSize]; //存放順序表元素
int length; //存放順序表的長度
}SqList; //聲明順序表的類型
//創(chuàng)建順序表
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n)
{
L->data[k]=a[i];
k++;
i++;
}
L->length=k;
}
//初始化線性表
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//銷毀線性表
void DestroyList(SqList *&L){
free(L);
}
//判斷線性表是否為空表
bool ListEmpty(SqList *L){
return(L->length==0);
}
//求線性表的長度
int ListLength(SqList *L){
return(L->length);
}
//輸出順序表
void DispList(SqList *L)
{
for(int i=0;i<L->length;i++)
{
printf("%d",L->data[i]);
}
}
//插入第i個元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-i];
L->data[i]=e;
L->length++;
return true;
}
//順序表的刪除
bool Delete(SqList *&L,int a)
{
if(L->length==0) //線性表為空
return 0;
if(a<L->length)
{
for(int i=a;i<L->length;i++)
{
L->data[i-1]=L->data[i];
}
L->length--;
}
return 1;
}
void main()
{
SqList *L;
InitList(L);
printf("請輸入順序表用空格分開按回車結(jié)束\n");
int i,y;
char s;
for(i=1;i<51&&s!='\n';i++){
scanf("%d",&y);
s=getchar();
ListInsert(L,i,y);
}
printf("輸出順序表L");DispList(L);
printf("\n請輸入刪除的位置和刪除的元素個數(shù):\n");
int a,b;
scanf("%d%d",&a,&b);
if(b>=L->length)
{
printf("輸入有誤\n");
}
else
{
while(b--)
{
Delete(L,a);
}
}
printf("輸出順序表L\n");
DispList(L);
DestroyList(L);
}
運(yùn)行結(jié)果:
測試結(jié)果:
通過!
2.已知順序表遞減有序,將元素x插入,保持其有序性
程序?qū)崿F(xiàn):
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
//定義順序表
typedef struct{
ElemType data[MaxSize]; //存放順序表元素
int length; //存放順序表的長度
}SqList; //聲明順序表的類型
//創(chuàng)建順序表
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n)
{
L->data[k]=a[i];
k++;
i++;
}
L->length=k;
}
//初始化線性表
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//銷毀線性表
void DestroyList(SqList *&L){
free(L);
}
//輸出順序表
void DispList(SqList *L)
{
int n;
int l;
n=L->length;
//冒泡排序法從小到大排序
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++){
if(L->data[j]<L->data[j+1]){
l=L->data[j];
L->data[j]=L->data[j+1];
L->data[j+1]=l;
}
}
}
for(i=0;i<L->length;i++){
printf("%d",L->data[i]);
}
}
//插入元素
bool ListInserts(SqList *&L,int i,ElemType e)
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-i];
L->data[i]=e;
L->length++;
return true;
}
//插入新增元素到最后
bool ListInsert(SqList *&L,ElemType e)
{
int i;
i=L->length+1;
ListInserts(L,i,e);
return true;
}
void main()
{
SqList *L;
InitList(L);
printf("請輸入順序表用空格分開按回車結(jié)束\n");
int i,y;
char s;
for(i=1;i<51&&s!='\n';i++){
scanf("%d",&y);
s=getchar();
ListInserts(L,i,y);
}
printf("輸出順序表L");DispList(L);
printf("\n輸入要插入的元素");
int f;
scanf("%d",&f);
ListInsert(L,f);
printf("再次輸出順序表");
DispList(L);
printf("\n");
DestroyList(L);
}
運(yùn)行結(jié)果:
測試結(jié)果:
通過!
六、實(shí)驗(yàn)總結(jié)
通過本次增加了對C語言的掌握,對順序表的建表、初始化、輸出等操作有了進(jìn)一步的認(rèn)識,同時對C語言主函數(shù)和子函數(shù)的調(diào)用進(jìn)一步的認(rèn)識。領(lǐng)會順序表存儲結(jié)構(gòu)和掌握順序表中各種基本運(yùn)算算法的設(shè)計(jì)。對C語言循環(huán)結(jié)構(gòu)、冒泡排序法等方法進(jìn)行了復(fù)習(xí)。在實(shí)驗(yàn)過程中會出現(xiàn)很多問題,出現(xiàn)程序報錯的情況。在測試階段發(fā)現(xiàn)出現(xiàn)的錯誤基本為小錯誤,如參數(shù)錯誤,調(diào)用錯誤,返回值錯誤等。一個程序最可怕的是無報錯錯誤,在程序不報錯的情況下運(yùn)行結(jié)果和實(shí)驗(yàn)結(jié)果不同,經(jīng)過調(diào)試后最終和實(shí)驗(yàn)結(jié)果相同。文章來源地址http://www.zghlxwxcb.cn/news/detail-724358.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)教程實(shí)驗(yàn)一順序表基本操作的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!