实验名称 顺序表的基本操作
一、实验目的:
1、复习C语言程序设计中的知识。
2、掌握线性表的顺序存储结构的表示和实现方法。
3、掌握顺序表基本操作的算法实现。
二、实验内容:
1.建立顺序表。
2.在顺序表上实现插入、删除和查找等操作。
三、实验要求:
编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:
⑴初始化字符型顺序表L;
⑵建立顺序表L,如(a,b,c,d,c);
⑶输出顺序表L的长度;
⑷输出顺序表L的第i个元素,如第3个元素;
⑸输出给定元素的位置,如输出元素a的位置;
⑹在第i个元素前插入给定元素,如在第4个元素前插入元素f;
⑺删除顺序表L的第i个元素,如删除顺序表L的第3个元素。
四、实验步骤:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 1024
typedef int elemtype;
typedef struct sequlist
{
elemtype data[maxsize]; //定义顺序表为一维数组
int last; //last为最后一个数据元素的下标位置
}SequenList;
//1 初始化字符型顺序表L
SequenList * lnit_SequenList()
{
SequenList *L;
L = (SequenList
*)malloc(sizeof(SequenList));/申请分配内存空间/
if (L != NULL) /申请分配内存空间成功/
{
L->last = -1; /*顺序表为空*/
printf("初始化成功!\n");
}
return L; //返回顺序表的首地址
}
/*2 建立顺序表L */
SequenList *indata_SeqList(SequenList *L)
{
elemtype x;
scanf("%d", &x);
while (x != 0)
{
L->last += 1;
L->data[L->last] = x;
scanf("%d", &x);
}
printf(“顺序表建立成功!\n”);
return L;
}
/3 输出顺序表L的长度/
int SequenList_Length(SequenList *L)
{
return (L->last + 1);
}
/* 4 输出顺序表L的第i个元素*/
int input_SequenList(SequenList *L, elemtype key)
{
int i;
for (i = 0; i <= L->last;
i++)
{
if (i + 1 == key)
{
printf("顺序表L的第i个元素为:%d\n", L->data[i]);
//printf("%d",
L->data[i]);
//return L->data[i];
}
}
if (key<=0 || key>(L->last))
{
printf("查找失败");
}
printf(“顺序表的所有元素为:\n”);
Print_SequenList(L);
return 0;
}
/* 5 输出给定元素的位置 */
int Search_SequenList(SequenList *L, elemtype pos)
{
int i;
for (i = 0; i <= L->last;
i++)
{
if (L->data[i] == pos)
{
printf("给定元素的位置为%d:\n", i + 1);
//return (i +1);
}
// if
(pos!=L->data[i] && i = L->last)
//{
// printf(“查找失败”);
// }
}
Print_SequenList(L);
/* i–;
if (i = L->last
&&(i+1)!=pos)
{
printf(“查找失败”);
}*/
return 0;
}
/* 6 在第i个元素前插入给定元素*/
int lnsert_SequenList(SequenList *L, int i, elemtype x)
/*在顺序表L中第i个数据元素之前插入一个元素e,插入前表长n=L->last+1,
i的合法取值范围是 1<=i<=L->last+2*/
{
int j;
if (L->last >= maxsize - 1)
{
printf("表已满无法插入");
return 0;
}
if ((i<1) || (i>L->last +
2))
{
printf("插入位置i值不合法");
return -1;
}
/为插入元素而移动位置/
for (j = L->last; j >= i -
1; j–)
{
L->data[j + 1] =
L->data[j];
}
L->data[i - 1] = x; /第i个元素下标为i-1/
L->last = L->last + 1;
printf(“新数组为:”);
Print_SequenList(L);
return 1;
}
/7 删除顺序表的第i个元素/
int Delete_SequenList(SequenList *L, int i, elemtype *e)
/*在顺序表中删除第i个元素,并用指针参数e返回其值,
i的合法取值范围为1<=i<=L.last+1*/
{
int k;
if ((i<1) || (i>L->last +
1))
{
printf("删除位置不合法");
return 0;
}
*e = L->data[i - 1]; /将删除的元素存放到e所指向的变量中/
for (k = i-1; k < L->last;
k++)
{
L->data[k] = L->data[k +
1];
//L->last--;
//Print_SequenList(L);
}
L->last–;
Print_SequenList(L);
return 1;
}
int Print_SequenList(SequenList *L)
{
int i;
if (L->last == -1) /顺序表为空,返回值为0/
{
return 0;
}
for (i = 0; i <= L->last;
i++)
{
//printf("顺序表的元素分别为:\n");
printf("a[%2d]=%3d\t",
i , L->data[i]);
}
return 1;
}
void main()
{
int i;
SequenList *L;
int menu;
int len;
int key;
int pos;
int x;
printf("\n************ 欢迎使用顺序表的基本操作系统 ************\n");
printf("\n************ 1 初始化字符型顺序表L ************\n");
printf("\n************ 2 建立顺序表L ************\n");
printf("\n************ 3 输出顺序表L的长度 ************\n");
printf("\n************ 4 输出顺序表L的第i个元素 ************\n");
printf("\n************ 5 输出给定元素的位置 ************\n");
printf("\n************ 6 在第i个元素前插入给定元素 ************\n");
printf("\n************ 7 删除顺序表的第i个元素 ************\n");
printf("\n************ 8 输出顺序表的所有元素 ************\n");
printf("\n************ 9 退出系统 ************\n");
printf(“请选择1-9:”);
while (1)
{
scanf("%d",
&menu);
switch (menu)
{
case 1:
{
L = lnit_SequenList();
break;
} ;
case 2:
{
printf("请输入元素(终止输入请输入0即可):");
indata_SeqList(L);
break;
};
case 3:
{
len = SequenList_Length(L);
printf("顺序表的长度为:%d\n", len);
break;
};
case 4:
{
printf("输出顺序表L的第i个元素 :");
scanf("%d", &key);
input_SequenList(L, key);
break;
};
case 5:
{
printf("输出给定元素的位置 :");
scanf("%d", &pos);
Search_SequenList(L, pos);
break;
};
case 6:
{
printf("在哪个元素前插入元素?\n");
scanf("%d", &i);
printf("插入的元素为:");
scanf("%d", &x);
lnsert_SequenList(L, i, x);
break;
};
case 7:
{
printf("请输入所需删除的元素编号:");
scanf("%d", &i);
Delete_SequenList(L, i,&i);
break;
};
case 8:
{
Print_SequenList(L);
break;
};
case 9:
{
printf("按任意键返回主菜单!\n");
break;
};
default:printf("\n 没有此功能,重新输入\n");
break;
}
}
}
五、实验结果:
一、实验目的:
1、复习C语言程序设计中的知识。
2、掌握线性表的顺序存储结构的表示和实现方法。
3、掌握顺序表基本操作的算法实现。
二、实验内容:
1.建立顺序表。
2.在顺序表上实现插入、删除和查找等操作。
三、实验要求:
编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:
⑴初始化字符型顺序表L;
⑵建立顺序表L,如(a,b,c,d,c);
⑶输出顺序表L的长度;
⑷输出顺序表L的第i个元素,如第3个元素;
⑸输出给定元素的位置,如输出元素a的位置;
⑹在第i个元素前插入给定元素,如在第4个元素前插入元素f;
⑺删除顺序表L的第i个元素,如删除顺序表L的第3个元素。
四、实验步骤:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 1024
typedef int elemtype;
typedef struct sequlist
{
elemtype data[maxsize]; //定义顺序表为一维数组
int last; //last为最后一个数据元素的下标位置
}SequenList;
//1 初始化字符型顺序表L
SequenList * lnit_SequenList()
{
SequenList *L;
L = (SequenList
*)malloc(sizeof(SequenList));/申请分配内存空间/
if (L != NULL) /申请分配内存空间成功/
{
L->last = -1; /*顺序表为空*/
printf("初始化成功!\n");
}
return L; //返回顺序表的首地址
}
/*2 建立顺序表L */
SequenList *indata_SeqList(SequenList *L)
{
elemtype x;
scanf("%d", &x);
while (x != 0)
{
L->last += 1;
L->data[L->last] = x;
scanf("%d", &x);
}
printf(“顺序表建立成功!\n”);
return L;
}
/3 输出顺序表L的长度/
int SequenList_Length(SequenList *L)
{
return (L->last + 1);
}
/* 4 输出顺序表L的第i个元素*/
int input_SequenList(SequenList *L, elemtype key)
{
int i;
for (i = 0; i <= L->last;
i++)
{
if (i + 1 == key)
{
printf("顺序表L的第i个元素为:%d\n", L->data[i]);
//printf("%d",
L->data[i]);
//return L->data[i];
}
}
if (key<=0 || key>(L->last))
{
printf("查找失败");
}
printf(“顺序表的所有元素为:\n”);
Print_SequenList(L);
return 0;
}
/* 5 输出给定元素的位置 */
int Search_SequenList(SequenList *L, elemtype pos)
{
int i;
for (i = 0; i <= L->last;
i++)
{
if (L->data[i] == pos)
{
printf("给定元素的位置为%d:\n", i + 1);
//return (i +1);
}
// if
(pos!=L->data[i] && i = L->last)
//{
// printf(“查找失败”);
// }
}
Print_SequenList(L);
/* i–;
if (i = L->last
&&(i+1)!=pos)
{
printf(“查找失败”);
}*/
return 0;
}
/* 6 在第i个元素前插入给定元素*/
int lnsert_SequenList(SequenList *L, int i, elemtype x)
/*在顺序表L中第i个数据元素之前插入一个元素e,插入前表长n=L->last+1,
i的合法取值范围是 1<=i<=L->last+2*/
{
int j;
if (L->last >= maxsize - 1)
{
printf("表已满无法插入");
return 0;
}
if ((i<1) || (i>L->last +
2))
{
printf("插入位置i值不合法");
return -1;
}
/为插入元素而移动位置/
for (j = L->last; j >= i -
1; j–)
{
L->data[j + 1] =
L->data[j];
}
L->data[i - 1] = x; /第i个元素下标为i-1/
L->last = L->last + 1;
printf(“新数组为:”);
Print_SequenList(L);
return 1;
}
/7 删除顺序表的第i个元素/
int Delete_SequenList(SequenList *L, int i, elemtype *e)
/*在顺序表中删除第i个元素,并用指针参数e返回其值,
i的合法取值范围为1<=i<=L.last+1*/
{
int k;
if ((i<1) || (i>L->last +
1))
{
printf("删除位置不合法");
return 0;
}
*e = L->data[i - 1]; /将删除的元素存放到e所指向的变量中/
for (k = i-1; k < L->last;
k++)
{
L->data[k] = L->data[k +
1];
//L->last--;
//Print_SequenList(L);
}
L->last–;
Print_SequenList(L);
return 1;
}
int Print_SequenList(SequenList *L)
{
int i;
if (L->last == -1) /顺序表为空,返回值为0/
{
return 0;
}
for (i = 0; i <= L->last;
i++)
{
//printf("顺序表的元素分别为:\n");
printf("a[%2d]=%3d\t",
i , L->data[i]);
}
return 1;
}
void main()
{
int i;
SequenList *L;
int menu;
int len;
int key;
int pos;
int x;
printf("\n************ 欢迎使用顺序表的基本操作系统 ************\n");
printf("\n************ 1 初始化字符型顺序表L ************\n");
printf("\n************ 2 建立顺序表L ************\n");
printf("\n************ 3 输出顺序表L的长度 ************\n");
printf("\n************ 4 输出顺序表L的第i个元素 ************\n");
printf("\n************ 5 输出给定元素的位置 ************\n");
printf("\n************ 6 在第i个元素前插入给定元素 ************\n");
printf("\n************ 7 删除顺序表的第i个元素 ************\n");
printf("\n************ 8 输出顺序表的所有元素 ************\n");
printf("\n************ 9 退出系统 ************\n");
printf(“请选择1-9:”);
while (1)
{
scanf("%d",
&menu);
switch (menu)
{
case 1:
{
L = lnit_SequenList();
break;
} ;
case 2:
{
printf("请输入元素(终止输入请输入0即可):");
indata_SeqList(L);
break;
};
case 3:
{
len = SequenList_Length(L);
printf("顺序表的长度为:%d\n", len);
break;
};
case 4:
{
printf("输出顺序表L的第i个元素 :");
scanf("%d", &key);
input_SequenList(L, key);
break;
};
case 5:
{
printf("输出给定元素的位置 :");
scanf("%d", &pos);
Search_SequenList(L, pos);
break;
};
case 6:
{
printf("在哪个元素前插入元素?\n");
scanf("%d", &i);
printf("插入的元素为:");
scanf("%d", &x);
lnsert_SequenList(L, i, x);
break;
};
case 7:
{
printf("请输入所需删除的元素编号:");
scanf("%d", &i);
Delete_SequenList(L, i,&i);
break;
};
case 8:
{
Print_SequenList(L);
break;
};
case 9:
{
printf("按任意键返回主菜单!\n");
break;
};
default:printf("\n 没有此功能,重新输入\n");
break;
}
}
}
五、实验结果:
六、实验总结:
顺序表存储位置是相邻连续的,可以随机访问的一种数据结构,一个顺序表在使用前必须指定其长度,一旦分配内存,则在使用中不可以动态的更改。它的优点是访问数据时比较方便,缺点是定义的长度不可更改造成存储空间的浪费。