数据结构-顺序表基本操作的实现

今天是线性表中的顺序表的实现,主要实现函数如下,读者有需要可以评论,我可以适当加几个。

//实现数组的以下操作,并编写程序验证你的操作。
int InputList(SeqList *L,int n); //输入n个整数存放到数组中
int PrintList(SeqList *L); //输出数组中的所有元素
int Locate(SeqList *L,ElemType e); //在数组L中查找e,返回找到的下标,否则返回-1
int InsList(SeqList *L,int i,ElemType e); //在数组L中下标为i的位置上插入元素e
int *DelList(SeqList *L,int i); //在数组L中删除下标为i的位置上的元素,用e返回删除元素的值
void merge(SeqList *LA, SeqList *LB, SeqList *LC); //将两个有序数组LA,LB 合并成一个数组LC。
代码如下:

#include<stdio.h>
#include<stdlib.h> 
#define  maxsize   20                      //数组的最大长度;
typedef int ElemType;
typedef  struct
{   ElemType  elem[maxsize];                    /*数组占用的空间*/ 
    int  last;                                  /*最后一个元素在数组elem[ ] 中的位置(下标值),空表置为-1*/
}SeqList;
SeqList list;
SeqList LA,LB,LC;                               //定义线性表数组 
//实现数组的以下操作,并编写程序验证你的操作。
int  InputList(SeqList *L,int n);               //输入n个整数存放到数组中
int  PrintList(SeqList *L);                     //输出数组中的所有元素
int  Locate(SeqList  *L,ElemType  e);           //在数组L中查找e,返回找到的下标,否则返回-1
int  InsList(SeqList *L,int i,ElemType  e);      //在数组L中下标为i的位置上插入元素e
int  *DelList(SeqList *L,int *i);               //在数组L中删除下标为i的位置上的元素,用*e返回删除元素的值
void merge(SeqList *LA,  SeqList *LB,  SeqList *LC); //将两个有序数组LA,LB 合并成一个数组LC。
int InputList(SeqList *L,int n)                  //函数作用为输入n个整数存放到数组中         
{
 L->last=n-1;                                  //将最后一个数组元素下标赋值给L->last 
 printf("请输入信息入数组\n");
 int i;
 for(i=0;i<n;i++)
 {
  scanf("%d",&L->elem[i]);                   //输入信息入每个数组 
  } 
}
int  PrintList(SeqList *L)                        //函数作用为打印每个数组的全部元素 
{
    printf("执行打印操作:\n"); 
    printf("打印输出数组信息如下:\n"); 
    int i,j=0;                                    //定义j的作用为换行所用 
 for(i=0;i<=L->last;i++)
 {
  printf("%4d",L->elem[i]);
  j++;         
  if(j%4==0)                               //每输出4个元素换行一次                         
  printf("\n");
  }
  printf("\n"); 
}
int  Locate(SeqList  *L,ElemType  e)             //函数作用为查找值e所在数组的下标位置 
{
 int i;
 for(i=0;i<=L->last;i++)
 {
  if(L->elem[i]==e)                       //查找到就跳出 
  break;
 }
 if(i>L->last)                               //遍历数组后未发现值等于e返回-1 
 return -1;
 else
 return i;                                   //找到就返回所在数组下标 
}
int  InsList(SeqList *L,int i,ElemType  e)       //函数作用为插入一个数进位置i 
{
 while(i<0||i>L->last+1)                      //判断插入位置是否合法 
 {
  printf("插入位置不合法请从新输入插入位置:  ");
  scanf("%d",&i);
  }
 if(i>L->last)                                //如果插入位置为最后一个就插到最后一个 
 {
  L->last++;                              //插入元素数组的最后L->last更换 
  L->elem[i]=e; 
 }
 else                                        //插入位置不为最后一个 
 {
  int j;
     for(j=L->last;j>=i;j--)                //从最后一个元素开始往后移开一位 
     {
     L->elem[j+1]=L->elem[j];
     }
     L->elem[i]=e;
     L->last++;                              //插入元素数组的最后L->last更换 
 }
}
int  *DelList(SeqList *L,int *i)               //函数作用删除位置为i的元素,i用指针原因将i传出函数 
{
 int k=*i;                                  //保存第一次输入的i值 
    ElemType *e;                               //作用为传出删除元素e的地址 
 while(k<0||k>L->last)                      //判断是否插入元素合法,不合法继续输入插入位置i 
 {
  printf("删除位置不合法请从新输入删除位置: ");
  scanf("%d",&k);
    }
    *i=k;                                      //将最后一次输入的合法的i赋值给*i,便于主函数的输出i 
 int j;
 *e=L->elem[k];                              //保存删除元素,最后返回用e返回 
 for(j=k+1;j<=L->last;j++)
 {
  L->elem[j-1]=L->elem[j];                //将所有的从i+1的元素向后移动一位 
 }
 L->last--;                                   //改变L->last的值 
 return e;                                   //返回删除元素 
}
void merge(SeqList *LA,  SeqList *LB,  SeqList *LC)  //函数作用为合并俩数组 
{
 int i=0,j=0,k=0; 
 while((i<=LA->last)&&(j<=LB->last))         //比较数组LA,LB的值,非递减的顺序合并 
 {
  if(LA->elem[i]<=LB->elem[j])           //比较L->A,L->B的值,将较小的插入L->C中 
  {                                    
   LC->elem[k]=LA->elem[i];          //将较小的插入L->C中
   i++,k++;                          //插入后下标都+1 
  }
  else
  {
   LC->elem[k]=LB->elem[j];         //同理插入较小的元素进L->C 
   j++,k++;                          //插入后下标往后移动一位 
  }
 }
 if(i>LA->last)                           //如果数组L->A比L->B长度短就将L->B剩下的元素插入L->C中 
 {
  for(j;j<=LB->last;j++)
  {
   LC->elem[k]=LB->elem[j];
   k++; 
  }
 }
 else                                     //如果数组L->A比L->B长度长就将L->A剩下的元素插入L->C中
 {
  for(i;i<=LB->last;i++)
  {
   LC->elem[k]=LA->elem[i];
   k++; 
  }
 }
 LC->last=k-1;                          //更新LC->last的值
}
int main()
{   printf("创建数组:\n");
 printf("请输入数组元素的个数  ");
 int n;                                
 scanf("%d",&n);                      //输入创建的数组的长度
 InputList(&list,n);                  //调用创建函数 
 PrintList(&list);                    //调用打印输出函数 
 int search_subscript,e1;            //定义需要查找的e1,和即将返回的元素下标search_subscript 
 printf("执行查找操作:\n");
 printf("请输入需要查找的元素值  ");
 scanf("%d",&e1);                    //输入查找的元素的值e1 
 search_subscript=Locate(&list,e1);  //将查找的元素的下标返回给 search_subscript
 if(search_subscript==-1)             //查找的元素不存在 
 printf("查找的元素不存在于此数组");
 else
 printf("经过查找的元素的下标为  %d\n",search_subscript); //输出查找的元素下标 
 int i,e2;                             //定义插入位置i和插入元素e2 
 printf("执行插入操作:");
 printf("请输入需要插入的元素下标和元素值  ");
 scanf("%d%d",&i,&e2);                 //输入位置i和插入元素e2
 InsList(&list,i,e2);                  //调用插入函数 
 printf("插入后元素后的新数组信息如下\n");
 PrintList(&list);                     //打印输出插入后的新数组 
 int *e3;                              //定义要删除的元素的值 
 printf("执行删除操作:\n");
 printf("请输入要删除的数组的下标  ");
 scanf("%d",&i);                       //输入要删除的位置i 
 e3=DelList(&list,&i);                 //将删除的元素的值返回赋值给e3 
 printf("删除元素后的数组信息如下\n");
 PrintList(&list);                      //打印输出删除后的数组 
 printf("删除的下标%d的元素的值为%d\n",i,*e3);
 printf("执行合并数组操作:即将创建两个数组LA,和LB\n"); 
 int n1,n2,count=1;                    //定义需要创建的两数组的长度,cuont为下面计算输出的第几个数组 
 printf("请输入创建的俩数组的元素的个数n1和n2分别是: ");
 scanf("%d%d",&n1,&n2);                //输入俩数组长度 
 printf("创建的第%d个数组如下:\n",count++);
 InputList(&LA,n1);                   //调用创建函数数组LA 
 printf("创建的第%d个数组如下:\n",count++);
 InputList(&LB,n2);                  //调用创建函数数组LB 
 merge(&LA,&LB,&LC);                //调用合并函数 
 PrintList(&LC);                     //打印输出的合并后的函数LC 
}

代码为本人学习数据结构时曾经写的作为参考,欢迎读者提出错误纠正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值