数据结构(C语言)--顺序表

一、学习目标:

  • 熟练掌握线性表的基本操作在顺序存储结构上的实现
  • 掌握顺序表的建立、查找、插入、删除等基本操作。

二、学习内容:

1、 分析、理解程序。
2、 完成插入操作的函数设计。
3、 调试程序:
建立12个元素的顺序表SqList={c,h,i,n,a,w,e,l,c,o,m,e},分别实现以下操作:
1)查找元素y在SqList中的位序,输出为O则表示“y不在SqList中”;
2)在SqList的元素6之前插入一个新元素#,输出插入后的结果;
3)删除SqList中第8个元素,输出删除后的结果

三、代码实现:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30
 struct  SqList
{
	char datas[MAXSIZE];
	int length;
};
typedef  struct  SqList SqList;

1、建立顺序表

//建立顺序表L
void creat_Sq(SqList *L)  
{
	char x; int j;	
	//按要求建立顺序表
	printf("按要求输入顺序表初始时的元素(切换用回车),以#结束:\n");
    fflush(stdin);
	scanf("%c",&x);
	j=0;
       while( x!='#')
        {
	   	L->datas[j]=x;  
         L->length++; j++;
		 fflush(stdin);
		scanf("%c",&x);
	   }
}

2、查找操作

//查找操作
int  LocateElem_Sq(SqList  *L, char  x)
{ //在顺序线性表L中查找第1个值与x相等的元素,若找到,则返回其在L中的位序,否则返回0
	
	int k;
	k=1;  //k的初值为第1个元素的位序
	while(k<=L->length && L->datas[k-1]!=x) k++;
	
	if(k<=L->length) 
		return k;
	else 
		return 0;
}

3、求顺序表长度

//求顺序表长度
int Get_length(SqList *L)
{
	return L->length;
}

4、插入操作

//插入操作
void ListInsert_Sq (SqList *L,int i,char e)
{//在顺序表L的第i个位置前插入一个新的元素e 
int k;
  if((L->length)>=MAXSIZE-1){
  	printf("overflow\n");
  }
  else
  	if((i<1)||(i>(L->length)+2)){
  		printf("error\n");
	  }
	else{
		for (k=L->length; k>=i-1; k--)
			L->datas[k+1]=L->datas[k];
		L->datas[i-1]=e;
		L->length=L->length+1;  
	}
}

5、删除操作

	int k;
	if((i<1)||(i>L->length)||(L->length==0))//出错处理,考虑算法的健壮性
		printf("error");  //i值不合法或表已空则出错
	else{
		for (k=i; k<L->length; k++)//将第i+1至第n个元素逐一向前移一个位置
			L->datas[k-1]=L->datas[k];
		L->length=L->length-1;  //将顺序表的长度减1
		}
}

6、输出顺序表

//输出顺序表
void PRINT(SqList *L)
{	int i;
	printf("顺序表的当前值为:\n");
	for(i=0;i<L->length;i++)
		printf("%c ",L->datas[i]);
	printf("\n");
}

7、main函数

main()
{	SqList * L;
	int k;
	int i;
	char x;

	//初始化顺序表
L=(SqList *)malloc(sizeof(SqList));
   L->length=0;  //空表长度为0
	printf("请选择您要进行的操作:\n");
	printf("0:退出\n");
	printf("1:建立顺序表L\n");
	printf("2:查找操作(查找某个元素的位序)\n");
	printf("3:求顺序表的长度\n");
	printf("4:插入操作(在顺序表L的第i个位置前插入一个新元素e)\n");
	printf("5:删除操作(删除顺序表L中的第i元素)\n");
	printf("6:输出操作(输出顺序表的当前值)\n");
	scanf("%d",&k);
	while( k<0 || k>6)
	{
		printf("您只能选择0-6,请重新输入:");
		scanf("%d",&k);
	}
	while( k>=0 && k<=6)
	{
	switch(k)
	{
    	case 0: exit(0);
		case 1: creat_Sq(L); 
			    break;
		case 2: printf("请输入待查找的元素x:");
		    	fflush(stdin);
			    scanf("%c",&x);
				printf("%d在顺序表中的位序为:%d\n",x,LocateElem_Sq(L, x));
				break;
		case 3: printf("顺序表的长度为:%d\n",Get_length(L));
			    break;
		case 4: printf("请输入待插入元素的位置i及元素的值x:");
			    scanf("%d",&i);
                fflush(stdin);
                scanf("%c",&x);  
			    ListInsert_Sq (L,i,x);
				break;
		case 5: printf("请输入待删除元素的位置i:");
			    scanf("%d",&i);
			    ListDelete_Sq(L,i);
				break;
		case 6: PRINT(L);
			    break;
		default: printf("您只能选择0-6,请重新输入:");
	}
    printf("——******************************——\n");
	printf("请选择您要进行的操作:\n");
	printf("0:退出\n");
	printf("1:建立顺序表L\n");
	printf("2:查找操作(查找某个元素的位序)\n");
	printf("3:求顺序表的长度\n");
	printf("4:插入操作(在顺序表L的第i个位置前插入一个新元素e)\n");
	printf("5:删除操作(删除顺序表L中的第i元素)\n");
	printf("6:输出操作(输出顺序表的当前值)\n");
	scanf("%d",&k);
	}
}

四、过程总结

1、初始化时给顺序表分配一个预定义大小的空间

2、顺序表创建向顺序表中输入数据,输入数据的类型要与类型定义中的类型一致。

3、在顺序表中查找一个元素x,需要从第一个元素开始顺序查找,依次比较每一个元素值,如果相等,则返回元素位置(第几个元素),如果查找整个顺序表都没找到,则返回0。

4、在顺序表中第i个位置之前插入一个元素x,需要从最后一个元素开始后移,直到把第i个元素也后移一位,然后把x放入第i个位置。
①判断插入位置i是否合法(空间是否溢出、前后位置是否合理)。
②将第n至第i 位的元素依次向后移动一个位置,空出第i个位置。
③将要插入的新元素x放入第i个位置,表长加1。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗中的小贤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值