原创 2个顺序表的差集(A-B)

2011-10-2 21:28 2011 9 9 分类: MCU/ 嵌入式

20111002212818259.png下面这个是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)
{
/*将线性表>

/*******************************************************************************
函数名:ListEmpty(SeqList L)
函数功能:判断线性表是否为空
入口参数:顺序表传值操作
出口参数:
********************************************************************************/
int ListEmpty(SeqList L)
{
/*判断线性表是否为空,线性表为空则返回1,否则返回0*/
 if(L.length==0)/*判断线性表的长度是否为0*/
  return 1;/*当线性表为空时,返回1,否则返回0*/
 else
  return 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;
}

下面这个是主函数:

 

/*******************************************************************************
函数名:DeleteList(SeqList *L, int i, DataType *e)
函数功能:删除操作
入口参数:
出口参数:
********************************************************************************/
#include<stdio.h>/*包含输入输出头文件*/
//#define ListSize 100
//typedef int DataType;/*元素定义为整型*/

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

#include"SeqList.h"/*包含顺序表实现文件*/
/*******************************************************************************
函数名:DelElem(SeqList *A, SeqList B)
函数功能:删除A中那些和B中元素相同的元素
入口参数:
出口参数:
********************************************************************************/
void DelElem(SeqList *A, SeqList B)
{
 int i,flag,pos;
 DataType e;
 for(i=0; i<=B.length; i++)
  {
   flag=GetElem(B,i,&e);//一次把B中的每个元素取出给e
   if(flag==1)
    {
     pos=LocateElem(*A,e);/*在A中查找和B中取出的元素
     e相等的元素*/
     if(pos>0)
      DeleteList(A, pos, &e);/*如果找到元素,将其从
     A中删除*/
    }
  }
}

/*******************************************************************************
函数名:main()
函数功能:主函数
入口参数:
出口参数:
********************************************************************************/
void main()
{
 int i,j,flag;
 DataType e;
 SeqList A,B;/*声明顺序表A和B*/
 InitList(&A);/*初始化顺序表A*/
 InitList(&B);/*初始化顺序表B*/
 for(i=1; i<=10;i++)/*将1-10插入到顺序表A中*/
  {
   if(InsertList(&A, i, i)==0)
    {
     printf("位置不合法");
     return;
    }
  }
 for(i=1,j=1; j<=6; i=i+2,j++)/*插入顺序表B中6个数*/
  {
   if(InsertList(&B, j, i*2)==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的元素删除后A中的元素:\n");
 DelElem(&A,B);
 for(i=1; i<=A.length; i++)
  {
   flag=GetElem(A,i,&e);
   if(flag==1)
    printf("%4d",e);
  }
 printf("\n");
 
}

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条