一、学习目标:
二、学习内容:
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、建立顺序表
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)
{
int k;
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)
{
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");
else{
for (k=i; k<L->length; k++)
L->datas[k-1]=L->datas[k];
L->length=L->length-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;
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。