一、实验目的
- 掌握顺序表的实现及顺序表的应用
2.实现顺序表的基本操作
二、实验环境
windows 7、Visual C++6.0
三、实验任务与内容:
1.编写顺序表的插入和删除算法
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define ElemType int
#define MAXSIZE 100
typedef struct
{
ElemType elem[MAXSIZE];
int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/
}SeqList;
int InsList(SeqList * L,int i,ElemType e)
{
int k;
if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/
{
printf("插入位置i值不合法");
return(ERROR);
}
if(L->last>= MAXSIZE-1)
{
printf("表已满无法插入");
return(ERROR);
}
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e; /*在C语言数组中,第i个元素的下标为i-1*/
L->last++;
return(OK);
}
void main()
{
SeqList *l;
int r,i,x,a;
l = (SeqList*)malloc(sizeof(SeqList));
printf("请输入线性表l的长度:");
scanf("%d",&r);
l->last=r-1;
printf("\n请输入各元素的值:\n");
for(i=0;i<=l->last;i++)
{
scanf("%d",&l->elem[i]);
}
printf("\n请输入要插入元素的位置:");
scanf("%d",&x);
printf("\n请输入要插入的元素:");
scanf("%d",&a);
InsList(l, x, a);
printf("\n输出插入元素后的元素:\n");
for(i=0;i<=l->last;i++)
{
printf("%d\t",l->elem[i]);
}
printf("\n");
}
//----------------------------------插入主函数
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define ElemType int
#define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/
typedef struct
{
ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/
int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/
}SeqList;
int DelList(SeqList *L,int i,ElemType *e) /*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L.last+1 */
{
int k;
if((i<1)||(i>L->last+1))
{
printf("delect a error place!");
return(ERROR);
}
*e = L->elem[i-1];
for(k=i; i<=L->last; k++)
L->elem[k-1] = L->elem[k];
L->last--;
return(OK);
}
void main()
{
SeqList *l;
int p,r;
int *q;
int i;
l = (SeqList*)malloc(sizeof(SeqList));
q = (int*)malloc(sizeof(int));
printf("please enter the length of stack:");
scanf("%d",&r);
l->last = r-1;
printf("please insert the menbers of the stack:\n");
for(i=0; i<=l->last; i++)
{
scanf("%d",&l->elem[i]);
}
printf("please input the place of number which you want to delect :\n");
scanf("%d",&p);
DelList(l,p,q);
printf("the stack was delected is :%d",*q);
printf("删除的元素值为:%d\n",*q);
}
//----------------------------------删除主函数
2. 编写将两个顺序表合并的算法
#include "common.h"
#include "seqlist.h"
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{
int i,j,k;
i=0;j=0;k=0;
while(i<=LA->last&&j<=LB->last)
if(LA->elem[i]<=LB->elem[j])
{
LC->elem[k]= LA->elem[i];
i++;
k++;
}
else
{
LC->elem[k]=LB->elem[j];
j++;
k++;
}
while(i<=LA->last) /*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/
{
LC->elem[k]= LA->elem[i];
i++;
k++;
}
while(j<=LB->last) /*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/
{
LC->elem[k]= LB->elem[j];
j++;
k++;
}
LC->last=LA->last+LB->last+1;
}
void main()
{
SeqList *la,*lb,*lc;
int r;
int i;
la=(SeqList*)malloc(sizeof(SeqList));
printf("请输入线性表A的长度:");
scanf("%d",&r);
la->last = r-1;
printf("请输入线性表A的各元素值:\n");
for(i=0; i<=la->last; i++)
{
scanf("%d",&la->elem[i]);
}
lb=(SeqList*)malloc(sizeof(SeqList));
printf("请输入线性表B的长度:");
scanf("%d",&r);
lb->last = r-1;
printf("请输入线性表B的各元素值:\n");
for(i=0; i<=lb->last; i++)
{
scanf("%d",&lb->elem[i]);
}
lc=(SeqList*)malloc(sizeof(SeqList));
merge(la,lb,lc);
printf("合并后线性表C中的元素为:\n");
for(i=0; i<=lc->last; i++)
{
printf("%d ",lc->elem[i]);
}
}
//----------------------------------合并主函数
四、实验结果与分析
分析:
1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于11),按输入顺序放入顺序表,输入以一1结束(注意一1不放到顺序表内):将创建好的顺序表元素依次输出到屏幕上。
2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作:然后将顺序表元素依次输出到屏幕上。
3)在已创建好的顺序表中删除一个元素:从健盘读入欲到除的元素位置(序号),调用删除函数完成删除操作:然后将顺序表元献依次输出到屏幕上。
4)删除除顺序表中元素值为负数的所有元素,然后将顺序表元素依次输出到屏幕上。