数据结构:线性表之顺序表


顺序表之缺点: 每当插入一个元素,可能会有相当多个元素挨着盘儿的往后挪.

                          每当删除一个元素,可能会有相当多个元素挨着盘儿地往前挪.

                          这浪费了大量的时间,一旦数据过大,这挪的时间就相当久了,而链表在插入和删除的时候,就可以不用挪,不会消耗很多时间.



问题1:main函数下面一句,SeqList L;定义一个SeqList类型的变量L,那么此时L中的数组会被初始化么?


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 20
typedef int ElemType;               /* typedef的意思是给int定一个别名ElemType,其实下面的ElemType elem [MaxSize]中的ElemType就是int,这样做的好处是,当变量elem的类型需要变的时候,直接在此处修改就好,不需要每个ElemType都修改. */
typedef struct SeqList              /* 顺序表结构定义,这个结构体代表的是一个顺序表,顺序表不就是一个数组么?既然有了数组,为什么还要把length变量和数组组织在一个结构体中?为什么需要length,那是因为虽然申请了一个长度为20的数组,但是顺序表可能只占这个数组的一部分,比如,顺序表的长度只有10,只占了数组的一半.而长度为20的数组就是一个数组,这个长度为10的数组才是一个顺序表.这个顺序表最大能存储的元素长度不会大于这个申请了的数组长度.这是一个局限性,说明顺序表长度是有一个限制的,这个限制就是包含它的数组的长度.并不能无限制增加元素. */
{
	ElemType elem [MaxSize];
	int length;                     //顺序表的长度.
}SeqList;                            //为struct SeqList这种数据类型定义一个别名SeqList,此时并未分配内存,只是声明一个数据类型.
int Init_SeqList(SeqList &L)       /*  初始化,一个SeqList类型的结构体变量传进来,把它的长度初始化为0,还有它的成员数组应该在声明这个结构体变量的时候就自然的初始化了.*/
{
	L.length=0;                   
	return 1;
}
int Locate_SeqList(SeqList &L,int x)       //在顺序表L中,查找元素X的位置,返回的是它在从1号数起的第几个位置(不是从0)
{
	int i = 0;
	while(i<L.length&&L.elem[i]!=x)
		i++;
	if(i>L.length)
	{
		printf("顺序表中不存在该元素!\n");
	    return 0;
	}
	else return i+1;
}
int Insert_SeqList(SeqList &L,int i,int x)      //在顺序表L中,把元素x,插入第i个位置,从1数起,插入第1个位置就是在数组下标0的位置.
{
	int j;
	if(L.length>MaxSize)
	{
		printf("顺序表已满,无法进行插入操作!");
	return 0;
	}
	if(i<=0||i>L.length+1)
	{
		printf("插入位置不正确!");
		return 0;
	}
	for(j=L.length-1;j>=i-1;j--)
	{	L.elem[j+1]=L.elem[j];  }
	L.elem[i-1]=x;
	L.length++;
	return 1;
}
int Delete_SeqList(SeqList &L,int i) //在顺序表L中,删除第i个元素(从1数起)
{
	int j;
	if((i<1)||(i>L.length))
	{
		printf("删除位置不正确!");
		return 0;
	}
	for(j=i;j<L.length;j++)
		L.elem[j-1]=L.elem[j];
	L.length=1;
	return 1;
}
int Display_SeqList(SeqList L)			//依次显示顺序表中的元素
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d",L.elem[i]);
	return 1;
}
void main(){
	SeqList L;                   //定义一个名为L的顺序表.
	ElemType e,x;
	int i=1,k,j;
	Init_SeqList(L);
	printf("初始化\n建立顺序表如下:\n");
	
	Insert_SeqList(L,1,1);
	Display_SeqList(L);
	printf("\n");

    Insert_SeqList(L,2,2);
	Display_SeqList(L);
	printf("\n");
	
	Insert_SeqList(L,3,3);
	Display_SeqList(L);
	printf("\n");
	
	Insert_SeqList(L,4,4);
	Display_SeqList(L);
    printf("\n");

	while(i<=3)
	{
		printf("\n           主菜单              \n");
		printf("\n     1   查找指定元素          \n");
		printf("\n     2   插入元素到指定位置    \n");
		printf("\n     3   删除某一位置指定元素  \n");
		printf("\n     0   结束程序              \n");
        printf("------------------------------------------\n");
		printf("请输入您选择的菜单号:");
		scanf("%d",&i);
		switch(i)
		{
		case 1 :
			printf("请输入查找的元素:");
			scanf("%d",&x);
			j=Locate_SeqList(L,x);
			if(j!=0)
				printf("指定元素位置=%d\n",&j);
			break;
		case 2 :
			printf("请输入插入的元素:");
			scanf("%d",&k);
			printf("请输入插入元素值:");
			scanf("%d,&x");
			j=Insert_SeqList(L,k,x);
			if(j!=0)
			{
				printf("插入后顺序表如下所示\n");
				Display_SeqList(L);
				printf("\n");
			}
			break;
		case 3 :
			printf("请输入删除的位置:");
			scanf("%d",&k);
			j=Delete_SeqList(L,k);
			if(j!=0)
			{
				printf("删除后顺序表如下所示\n");
				Display_SeqList(L);
				printf("\n");
			}
			break;
		case 0 :
			exit(0);
			break;
		default:
			printf("输入有误!");
		}
	}
}



 

猜你喜欢

转载自blog.csdn.net/qq_21867719/article/details/60967141