原创 合并2个顺序表

2011-10-2 21:25 2295 8 8 分类: MCU/ 嵌入式

头文件:SeqList.h

/*******************************************************************************
文件名:SeqList.h
文件功能:顺序表的基本运算
********************************************************************************/
#define ListSize 100

typedef int DataType;/*定义元素类型为整型*/

/*顺序表类型定义*/
typedef struct
{
 DataType list[ListSize];
 int length;
}SeqList;

/*******************************************************************************
函数名:InitList(SeqList *L)
函数功能:线性表的初始化操作
入口参数:顺序表首地址
出口参数:
********************************************************************************/
void InitList(SeqList *L)
{
/*将线性表初始化为空的线性表只要把线性表的长度length置为
0*/
 L->length=0;/*把线性表的长度置为0*/
}

/*******************************************************************************
函数名:GetElem(SeqList L, int i, DataType *e)
函数功能:按序号查找操作
入口参数:L ,i,e
出口参数:
********************************************************************************/
int GetElem(SeqList L, int i, DataType *e)
{
/*查找线性表中第i个元素,查找成功将改值返回给e,并返回
1表示成功,否则返回-1表示失败*/

 if(i<1 || i>L.length)/*查找第i个元素之前,先判断该序号是否合法*/
  return -1;
 
 *e = L.list[i-1];/*将第i个元素的值赋给e*/
 return 1;
}

/*******************************************************************************
函数名:LocateElem(SeqList L,DataType e)
函数功能:按内容查找操作
入口参数:
出口参数:
********************************************************************************/
int LocateElem(SeqList L,DataType e)
{
/*查找线性表中元素值为e的元素,查找成功将对应元素的序号
返回,否则返回0表示失败*/
 int i;
 for(i=0;i<L.length;i++)/*从第一个元素开始比较*/
  if(L.list==e)
   return i+1;
  return 0;
}

/*******************************************************************************
函数名:InsertList(SeqList *L, int i, DataType e)
函数功能:插入操作
入口参数:
出口参数:
********************************************************************************/
int InsertList(SeqList *L, int i, DataType e)
{
/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入位置
不合法返回-1,顺序表满返回0*/

 int j;
 if(i<1 || i>L->length+1)/*在插入元素之前,判断插入位置是否合法*/
  {
   printf("插入位置i不合法!\n");
   return -1;
  }
 else if(L->length >= ListSize)/*在插入元素之前判断顺序表是否
  已经满,不能插入元素*/
  {
   printf("顺序表已满,不能插入元素。\n");
   return 0;
  }
 else
  {
   for(j=L->length;j>=i;j--)/*将第i个位置以后的元素一次后移*/
     L->list[j]=L->list[j-1];

     L->list[i-1]=e;/*插入元素到第i个位置*/
     L->length=L->length+1;/*将顺序表长增1*/
     return 1;
  }
}

/*******************************************************************************
函数名:DeleteList(SeqList *L, int i, DataType *e)
函数功能:删除操作
入口参数:
出口参数:
********************************************************************************/
int DeleteList(SeqList *L, int i, DataType *e)
{
 int j;
 if(L->length<=0)
  {
   printf("顺序表已经不能进行删除!\n");
   return 0;
  }
 else if(i<1 || i>L->length)
  {
   printf("删除位置不合适!\n");
   return -1;
  }
 else
  {
   *e=L->list[i-1];
   for(j=i;j<=L->length-1;j++)
    L->list[j-1]=L->list[j];
   L->length=L->length-1;
   return 1;
  }
}

/*******************************************************************************
函数名:ListLength(SeqList L)
函数功能:返回线性表的长度操作
入口参数:
出口参数:
********************************************************************************/
int ListLength(SeqList L)
{
 return L.length;
}

/*******************************************************************************
函数名:ClearList(SeqList *L)
函数功能:返回线性表的长度操作
入口参数:
出口参数:
********************************************************************************/
void ClearList(SeqList *L)
{
 L->length=0;
}

 

主函数体:

 

#include<stdio.h>

#include"SeqList.h"

void MergeList(SeqList A, SeqList B,SeqList *C)
{
 int i,j,k;
 DataType e1,e2;
 i=1;
 j=1;
 k=1;
 while(i<=A.length && j<B.length)
  {
   GetElem(A, i, &e1);
   GetElem(B, j, &e2);
   if(e1<=e2)
    {
     InsertList(C, k, e1);
     i++;
     k++;
    }
   else
    {
     InsertList(C, k, e2);
     j++;
     k++;
    }
  }
 while(i<=A.length)
  {
   GetElem(A, i, &e1);
   InsertList(C, k, e1);
   i++;
   k++;
  }
 while(j<=B.length)
  {
   GetElem(B, j, &e2);
   InsertList(C, i, e2);
   j++;
   k++;
  }
 C->length=A.length+B.length;
}

void main()

{
 int i,flag;
 DataType a[]={6,11,11,23};
 DataType b[]={2,10,12,12,21};
 DataType e;
 SeqList A,B,C;/*声明顺序表A,B,C*/
 InitList(&A);/*初始化顺序表A*/
 InitList(&B);/*初始化顺序表B*/
 InitList(&C);/*初始化顺序表C*/
 for(i=1; i<=sizeof(a) / sizeof(a[0]); i++)
  {
   if ( InsertList( &A, i, a[i-1]) == 0 )
    {
     printf("位置不合法");
     return;
    }
  }
 for(i=1; i<=sizeof(b) / sizeof(b[0]); i++)
  {
   if(InsertList(&B, i, b[i-1])==0)
    {
     printf("位置不合法");
     return;
    }
  }
 printf("顺序表A中的元素:\n");
 for(i=1; i<=A.length; i++)
  {
   flag=GetElem(A, i, &e);
   if(flag==1)
    printf("%4d",e);
  }
 printf("\n");
 printf("顺序表B中的元素:\n");
 for(i=1; i<=B.length; i++)
  {
   flag=GetElem(B, i, &e);
   if(flag==1)
    printf("%4d",e);
  }
 printf("\n");
 printf("将在A中出现B的元素合并后C中的元素:\n");
 MergeList(A,B,&C);
 for(i=1; i<=C.length; i++)
  {
   flag=GetElem(C, i, &e);
   if(flag==1)
    printf("%4d",e);
  }
 printf("\n");
 

}

20111002212540177.png

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条