一 .实验内容
1.Description
建立一个顺序表,然后在已建好的顺序表上实现顺序表插入和删除等基本操作。最后输出最终结果。
要求:Time Limit:1000MS Memory Limit:65536K
2.eg.Input
有多组测试数据,每组数据由三部分组成。第一部分包含两个整数n(n<=1000)和m(m<=1000),n表示第二部分包含n个整数,m表示第三部分包含m个操作。操作项的格式有:insert i x和delete i。insert i x 表示在第i个位置插入数字x,delete i表示删除第i个元素。当n和m同时为0时结束。
Output
对于每组数据,按顺序输出顺序表中的元素。输出结果占一行。
Sample Input
4 5
2 3 4 5
insert 2 6
delete 4
insert 2 9
insert 1 100
delete 4
Sample Output
100 2 9 3 5
二.实验源程序
#include <stdio.h>
#include <stdlib.h>
# define M 100
# define N 10
typedef struct {
int *elem;
int length;
int size;
}SqList;
void InitList(SqList &L,int n){
L.elem = (int *)malloc(M * sizeof(int));
L.length = n; //空间长度为n
L.size = 100; //初始存储容量
}
void show(SqList L){
for(int i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
return;
}
void InsertList(SqList &L, int i, int e){
if (i<1||i>L.length+1)
return; //i值不合法
if (L.length == L.size) { //当前存储空间已满,增加分配
int *newbase;
newbase = (int *)realloc(L.elem,(L.size +N)* sizeof(int));
L.elem = newbase; //新基址
L.size += N; //增加出差容量
}
for (int j = L.length;j>=i;j--){
L.elem[j] = L.elem[j-1];
}
L.elem[i-1] = e;
L.length++; //表长增1
return;
}
void DeleteList(SqList &L, int i){
if (i<1||i>L.length)
return;//i值不合法
for (int j = i; j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
L.length--; //表长减1
return;
}
void main(void){
int n,m,i,e;
char s[7];
SqList list;
while (printf("\n输入数据n m\n")&&scanf("%d %d",&n,&m)&&(n||m)){
InitList(list,n);
printf("\n输入%d个整数\n",n);
for (int j=1; j<=n; j++)
scanf ("%d",&list.elem[j-1]);
printf("\n输入数据insert i x或delete i\n");
for (int k=0;k<m;k++){
scanf("%6s %d",&s,&i);
if (s[0]=='i'){
scanf("%d",&e);
InsertList(list,i,e);
}
else if (s[0]=='d')
DeleteList(list,i);
}
show(list);
}
}
四..实验结果
(1)
(2)
实验一 顺序表问题
【实验报告】
《数据结构与算法》实验报告一
学院: 计算机与信息学院
学号:
日期: 班级: 姓名: 程序名:
一、上机实验的问题和要求:
顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求:
1. 从键盘输入10个整数,产生顺序表,并输出结点值。
调试数据:9 8 7 6 5 4 3 2 1
2. 从键盘输入1个整数,在顺序表中查找该结点。若找到,输出结点的位置;若找不到,
则显示“找不到”。
调试数据:第一次输入 11,第二次输入3
3. 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插
入在对应位置上,输出顺序表所有结点值,观察输出结果。
调试数据:第一次insert "11" after "6" , 第二次insert "86" at "2"
4. 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。
调试数据:第一次delete the number at "2" ,第二次delete value "9"
注意:顺序表输出表现形式如下(实验报告上为截图):
顺序表:
第一题
Initially Seq: head -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null 第二题
找不到
6
第三题
insert "11" after "6": head -> 9 -> 8 -> 7 -> 6 -> 11 -> 5 -> 4 -> 3 -> 2 -> 1 -> null
insert"86"at"2":head -> 9 -> 8 -> 86 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null
第四题
delete the number at "2":head -> 9 -> 8 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 ->null delete value "9": head -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null
二、源程序及注释:
以下程序仅供参考,其结果不代表本实验要求。学生可输入以下程序,调试并运行之,分析输出结果,然后结合书本上的算法进行修改,完成上述实验内容,请实验完成之后,把正确的程序复制在此处。程序一:
public class Searching {
private static final int NONE = -1;
public static int linearSearch1(Object[] a,int left, int right, Object val)
{
for (int i = left; i <= right; i++)
if (val.equals(a[i]))
return i;
return NONE;
}
public static int linearSearch2(Comparable[] a, int left, int right, Comparable val)
{
for (int i = left; i <= right; i++)
{ int comp = val.compareTo(a[i]);
if (comp == 0)
return i;
else if (comp < 0)
break;
}
return NONE;
}
public static int binarySearch(Comparable[] a,
int left, int right, Comparable val)
{
int l = left, r = right;
while (l <= r) {
int m = (l + r) / 2;
int comp = val.compareTo(a[m]);
if (comp == 0) return m;
else if (comp < 0) r = m - 1;
else l = m + 1;
}
return NONE;
}
public static void main(String[] args) {
String[] word1 = {"dog", "cat", "rat", "pig", "fox", "eel"};
int left1 = 0, right1 = word1.length - 1;
String[] word2 = {"cat", "dog", "eel", "fox", "pig", "rat"};
int left2 = 0, right2 = word2.length - 1;
String[] testcases = {"ant", "bat", "cat", "dog", "eel","fox", "hen", "pig", "rat"}; for (int t = 0; t < testcases.length; t++) {
String target = testcases[t];
System.out.println(target
+ " " + linearSearch1(word1, left1, right1, target) + " "
+ linearSearch2(word2, left2, right2, target)
+ " " + binarySearch(word2, left2, right2, target));
}
}
}
程序二
public class Searching {
private static final int NONE = -1;
public static int linearSearch1(Object[] a,int left, int right, Object val) {
for (int i = left; i <= right; i++)
if (val.equals(a[i]))
return i;
return NONE;
}
public static int linearSearch2(Comparable[] a, int left, int right, Comparable val) {
for (int i = left; i <= right; i++)
{ int comp = val.compareTo(a[i]);
if (comp == 0)
return i;
else if (comp < 0)
break;
}
return NONE;
}
public static int binarySearch(Comparable[] a,
int left, int right, Comparable val)
{
int l = left, r = right;
while (l <= r) {
int m = (l + r) / 2;
int comp = val.compareTo(a[m]);
if (comp == 0) return m;
else if (comp < 0) r = m - 1;
else l = m + 1;
}
return NONE;
}
public static void main(String[] args) {
String[] word1 = {"dog", "cat", "rat", "pig", "fox", "eel"};
int left1 = 0, right1 = word1.length - 1;
String[] word2 = {"cat", "dog", "eel", "fox", "pig", "rat"};
int left2 = 0, right2 = word2.length - 1;
String[] testcases = {"ant", "bat", "cat", "dog", "eel","fox", "hen", "pig", "rat"}; for (int t = 0; t < testcases.length; t++) {
String target = testcases[t];
System.out.println(target
+ " " + linearSearch1(word1, left1, right1, target) + " "
+ linearSearch2(word2, left2, right2, target)
+ " " + binarySearch(word2, left2, right2, target));
}
}
}
三、运行输出结果:
四、调试和运行程序过程中产生的问题及采取的措施:
选课时间段周四6789序号实验报告课程名称数据结构实验名称顺序表的实现指导教师学生姓名学生学号实验日期20xx年4月11日1一实验…
一实验目的二实验内容和要求三源代码1顺序表的代码2单链表的代码四测试结果1顺序表的测试结果2单链表的测试结果五心得体会实验一线性表…
数据结构实验报告1实验目的结出本次实验所涉及并要求掌握的知识点1学会定义线性表的顺序存储类型实现C程序的基本结构对线性表的一些基本…
实验1顺序表的操作一12345678实验要求输入一组整型元素序列建立顺序表实现该顺序表的遍历在该顺序表中进行顺序查找某一元素查找成…
实验一顺序表的插入和删除实验目的1掌握使用TurboC上机调试线性表的基本方法2掌握线性表的基本操作插入删除在顺序存储结构上的运算…
数学与计算科学学院实验报告实验项目名称线性表的顺序表示和实现所属课程名称数据结构A实验类型验证性实验日期20xx年4月5号班级信管…
数据结构随堂实验实验报告指导教师姓名学号班级专业计算机科学与技术目录C语言结构体与指针1线性顺序表的实现及操作3串的匹配与替换6线…
实验1顺序表的操作一12345678实验要求输入一组整型元素序列建立顺序表实现该顺序表的遍历在该顺序表中进行顺序查找某一元素查找成…
实验一顺序表的基本操作一实验目的掌握线性表的顺序表基本操作建立插入删除查找合并打印等运算二实验要求包含有头文件和main函数1格式…