线性表顺序表示

seqlist.h

typedef struct alist
{int n;         //表元素数量
 int maxsize;   //表数组长度
 ListItem *table;  //表动态数组
}Alist;
typedef struct alist *List;

List ListInit(int size)     //表结构初始化
{
 List L=(List)malloc(sizeof(alist));                 //表空间初始化
 L->table=(ListItem *)malloc(size*sizeof(ListItem));   //分配指定size个元素的空间
 L->maxsize=size;                          //表数组长度定为size
 L->n=0;                                   //表实际元素为0个
 return L;}

void DestroyList(List  L)
{
  if (L) free(L);      //释放线性表占据的所有存储空间
}

void  ListEmpty(List L)     //清空表  
{
   L->n=0;         //表实际元素为0个          
}

int ListLength(List L)
{
 return L->n;         //取得表实际元素为n个
}

int IsEmpty(List L)
{
  if (L->n==0) return 1;     
   else return 0;
}

int ListLocate(ListItem x,List L)    //查找元素x在L中的位置
{
 int i;
 for(i=0;i<L->n;i++)
  if(L->table[i]==x) return ++i;
 return 0;
}

ListItem ListRetrieve(int k,List L)    //查找第k个元素的值
{
 if(k<1||k>L->n) printf("out of bounds");
 return L->table[k-1];
}

void ListInsert(int k,ListItem x,List L)    //在第k个元素后添加元素x
{
 int i;
 if(k<0||k>L->n) printf("out of bounds");
    if(L->n==L->maxsize) printf("out of memory");
 for(i=L->n -1;i>=k;i--)L->table[i+1]=L->table[i];
 L->table[k]=x;
 L->n++;
}

ListItem ListDelete(int k,List L)    //在第k个位置删除元素x
{
 int i;
    ListItem x;
 if(k<1||k>L->n) printf("out of bounds");
    x=L->table[k-1];
 for(i=k;i<L->n;i++)L->table[i-1]=L->table[i];
 L->n--;
 return x;
}

ListItem PriorElem(ListItem x,List L)   
{
 //请在下面编写代码,返回X的前驱
int i;
 for(i=1;i<L->n;i++)
  if(L->table[i]==x) return L->table[i-1];
     return 0;


}
ListItem NextElem(ListItem x,List L)   
{
 //请在下面编写代码,返回X的后继
  int i;
 for(i=0;i<L->n-1;i++)
  if(L->table[i]==x) return L->table[i+1];
    return 0;


}

void Reverse(List L)
{
 //请在下面编写代码,完成L的反转
    ListItem temp;
 for(int i=0;i<L->n/2;i++)
 {temp=L->table[i];L->table[i]=L->table[L->n-1-i];L->table[L->n-1-i]=temp;}

}
List Merge(List A,List B)
{List L=ListInit(A->n+B->n);
return L;

}
void Merge(List A,List B,List L)
{
    //合并A和B到L中,要求降序排列
 

L->n=A->n+B->n;
 int i=0,j=0,k=0;
 while(j<A->n&&k<B->n)
  if(A->table[j]>B->table[k])L->table[i++]=A->table[j++];
   else L->table[i++]=B->table[k++];
 if(j>=A->n)
  for(;k<B->n;k++)
   L->table[i++]=B->table[k];
 else
        for(;j<A->n;j++)
   L->table[i++]=A->table[j];

}

void Alternate(List A,List B,List L)
{
    //交叉合并A和B到L中

int i=0,j=0,k;
for (k=0;i<=A->n || j<=B->n;i++,j++)
{ L->table[k++]=A->table[i];
L->table[k++]=B->table[j]; }

   L->n=k-2;

}

 

seqlist.cpp

#include<stdio.h>
#include<stdlib.h>
typedef int ListItem;
#include "seqlist.h"
void PrintList(List L)
{
 int n,i;
 n=ListLength(L);
 for(i=1;i<=n;i++)
 {
  printf("%6d",ListRetrieve(i,L));
  if(i%10==0)
   printf("/n");
 }
 printf("/n");
}
void main()
{
 int i,data[5]={8,34,67,9,1},data1[5]={67,55,34,12,8},data2[6]={61,31,5,3,2,1};
 List L,L1,L2;
 L=ListInit(50);
 for(i=0;i<5;i++)
 {   ListInsert(i,data[i],L);}
 printf("原始的线性表:/n");
 PrintList(L);
 //检验前驱函数
    printf("34的前驱是%d/n",PriorElem(34,L));
 printf("8的前驱是%d/n",PriorElem(8,L));
 //检验后继函数
    printf("9的后继是%d/n",NextElem(9,L));
 printf("1的后继是%d/n",NextElem(1,L));

    //检验反转函数
 Reverse(L);
     printf("反转后的线性表:/n");
    PrintList(L);
  
 //检验Merge函数
 //初始化L1 “67,55,34,12,8”
 L1=ListInit(10);
 for(i=0;i<5;i++)
 {   ListInsert(i,data1[i],L1);}
    printf("原始的线性表L1:/n");
 PrintList(L1);
    //初始化L2 “61,31,5,3,2,1”
 L2=ListInit(10);
 for(i=0;i<6;i++)
 {   ListInsert(i,data2[i],L2);}
 printf("原始的线性表L2:/n");
 PrintList(L2);
    //调用MERGE函数并显示结果应为"67,61,55,34,31,12,8,5,3,2,1"
    ListEmpty(L);
 Merge(L1,L2,L);
 printf("合并后的线性表:/n");
 PrintList(L);
   
 //调用Alternate函数并显示结果应为"67,61,55,31,34,5,12,3,8,2,1"
    ListEmpty(L);
 Alternate(L1,L2,L);
 printf("交叉合并后的线性表:/n");
 PrintList(L);


 //销毁线性表
 DestroyList(L2);
 DestroyList(L1);
 DestroyList(L);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值