数据结构实验报告:线性表顺序存储

一、实验目的

  1. 掌握顺序表的实现及顺序表的应用 

     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)删除除顺序表中元素值为负数的所有元素,然后将顺序表元素依次输出到屏幕上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值