0
点赞
收藏
分享

微信扫一扫

数据结构——线性表(顺序表)


#include<stdio.h>
#define MAXLEN 100  /*定义一个100的储量空间*/
typedef struct     /*定义一个结构体类型,即顺序表储存类型*/
{
	int array[MAXLEN];   /*存放顺序表的数组*/
	int  length;      /*顺序表的长度*/
}SeqList;


 /*顺序表的初试化*/
void InitList(SeqList *L)
{
	//初试化顺序表的函数L
	L->length = 0;
}

  /*顺序表的建立*/
void CreateList(SeqList *L,int n)
{ 
	//建立顺序表并输入多个元素函数
	int i;
	printf("请输入%d个整数:",n);
	for (i = 0 ; i < n; i++)
	{
		scanf_s("%d",&L->array[i]);
	}
	L->length = i;   /*顺序表的长度为i*/
}

       /*顺序表的插入*/
int InsElem(SeqList* L, int i, int x) /* L代表存在,i代表表中的元素位置,x要插入的元素*/
{            
	/*在顺序表中第i个位置,插入元素x*/
	int j;
	if (L->length >= MAXLEN)       //检查顺序表是否已满
	{
		printf("顺序表已满!");
		return -1;
	} 
	if (i<1 || i>L->length + 1)               //检查插入位置的正确性,是否存在这个位置
	{
		printf("插入位置错误!");
		return 0;
	}
	if (i == L->length + 1)				//插入位置为表尾,直接插入,不用移动数组
	{
		L->array[i - 1] = x;      //插入新元素
		L->length++;				//表长加1
		return 1;
	}
	for (j = L->length - 1; j >= i - 1; j--) //插入位置不为表尾,插入点后各位置向后移
	{
		L->array[j + 1] = L->array[j];       
	}
	L->array[i - 1] = x;            //插入新元素
		L->length++;				//表长加1
		return 1;
}

 /*顺序表的删除*/
int  DelElem(SeqList *L,int i,int *x)    /* L代表存在,i代表表中的元素位置,x要删除的元素,即将要删除的元素给x*/
{
	int j;
	if (L->length == 0)                //判断顺序表是否为空 
	{
		printf("顺序表为空!");
		return 0;
	}
	if (i<1 || i>L->length)         //检查顺序表删除的位置是否正确
	{
		printf("不存在第i个元素!");
		return 0;
	}
	*x = L->array[i - 1];         /*将要删除的元素给指针变量*x      */
	for (j = i; j < L->length; j++)
		/*L->array[j] = L->array[j+1];*/    //这种写法是错误的,i+1的下标超界了
		L->array[j-1] = L->array[j];      
		L->length--;
	
	return 1;
}

/*顺序表的查找操作*/
int GetElem(SeqList* L, int i, int *x)    //L顺序表存在, i表中元素的位置, x找到该元素并返回的值
{ 
         //按位置查找
	if (i<1 || i>L->length)    //判断查找位置是否正确
	{
		return 0;
	}
	else
	{
		*x = L->array[i - 1];      //将表中第i个元素赋值给指针变量
		return 1;
	}
 }
		/*顺序表的查找操作*/
int  Locate(SeqList* L, int x)
{
	//按值查找
	int i=0;
	while (i < L->length && L->array[i] != x)
		i++;
		if (i >= L->length)   //i大于表长返回失败
			return 0;      
		else 
			return i + 1;       // 返回元素的位置
}

void DispList(SeqList* L)
{
//显示顺序表中的每个元素
	int i; 
	for (i = 0; i < L->length; i++)
	{
		printf("%4d",L->array[i]);
	}
}

void Menu()
{
	printf("\n\n1.建立顺序表");
	printf("\n2.插入元素");
	printf("\n3.删除元素");
	printf("\n4.按位置查找元素"); 
	printf("\n5.按值查找元素");
	printf("\n6.求顺序表的长度");
	printf("\n7.返回");
	printf("请输入菜单号(1-7):");

}
int main()
{  
	SeqList L;   /*定义一个顺序表*/
	int x;    //元素的值
	int i;       //线性表元素的位置
	int ch2,ch1='y';
	int n;     //线性表的个数
	int loc;
	int a;
	while (ch1 == 'y') {
		Menu();
		scanf_s("%d", &ch2);
		getchar();
		switch (ch2)
		{
		case 1:
			InitList(&L);
			printf("请输入建立线性表的个数:");
			scanf_s("%d", &n);
			CreateList(&L, n);
			printf("建立的线性表为:");
			DispList(&L);
			break;
		case 2:
			printf("请输入要插入的位置:");
			scanf_s("%d",&i);
			printf("请输入要的元素:");
			scanf_s("%d",&x);
			if (InsElem(&L, i, x))
			{
				printf("已成功在第%d的位置上插入元素%d,插入后的线性表为:\n", i, x);
				DispList(&L);
			}
			else
				printf("插入的参数错误!");
			break;
		case  3:
			printf("请输入要删除元素的位置:");
			scanf_s("%d",&i);
			if (DelElem(&L, i, &x))
			{
				printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n", i, x);
				DispList(&L);
			}
			else
				printf("删除的参数错误!");
			break;
		case 4:
			printf("请输入要查看的表中元素的位置(从1开始):");
			scanf_s("%d",&i);
			if (GetElem(&L, i, &x))
			{
				printf("当前线性表的第%d个位置是:%d", i, x);
			}
			else
				printf("输入的位置错误!");
			break;
		case 5:
			printf("请输入要查找的元素值为:");
			scanf_s("%d",&x);
			loc = Locate(&L, x);
			if (loc)
			{
				printf("查找元素值为%d的位置为:%d",x,loc);
			}
			else
				printf("表中无此元素!");
			break;
		case 6:
			printf("当前线性表的长度为:%d",L.length);
			break;
		case 7:
			ch1 = 'n';
			break;
		default:printf("请在1-7之间进行输入!");
		}
	}
	return 0;
}

效果图:

 

举报

相关推荐

0 条评论