数据结构--初学线性表

/*线性表基本操作
定义结构体Sqlist线性表类型
InitList_Sq(Sqlist *L)建表
InputList_Sq(SqList *L, int n)输入数据
PrintList_Sq(SqList L)输出数据
MergListe_Sq(SqList *La, SqList *Lb, SqList *Lc)
合并序列 
******以上几个方法是方法体中的法名及定义 
******以下为int main中的法名
lookprintf_Sq(&L,item);
查找元素item并输出位置 
DeleteItem_Sq (&L, item)
删除等于指定值item的元素
ListInsert_Sq(&SL,i,e);
在指定位置i插入元素e
ListInsert_Sq(&L,item);
在有序线性表中插入元素item  
delite_Sq(&L);
删除位置s到t之间的元素
max_Sq(&L);
找出并输出最大值
Delite_Sq(&L,i);
删除指定位置i的元素并输出剩余的 
min_Sq(&L);
找输出线性表中的最小值 
地址指针&用箭头,结构的实例用点。*&L=L 
*/ 
#include <stdlib.h>
#include <stdio.h>
#define LIST_INIT_SIZE    20
#define LISTINCREMENT   10
#define OK                1
#define OVERFLOW        -2
typedef int ElemType;
typedef int Status;
typedef struct {
        ElemType *elem;
        int length;
        int listsize;
}SqList;
//建表1 
Status InitList_Sq(SqList *L)
{
    L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem)exit(OVERFLOW);
    L->length=0;
    return 1;   
}
建表2
//Status InitList_Sq(SqList &L){
//    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//    if(!L.elem)exit(OVERFLOW);
//    L.length=0;
//    return 1;
//}
//输入数据 
void InputList_Sq(SqList *L, int n)
{
	 //1,输入元素个数换行,分别输入元素   
		scanf("%d",&n);
        for(int i=0;i<n;i++){
        scanf("%d",&L->elem[i]);
        L->length++;}
}
//输出序列 
void PrintList_Sq(SqList L)
{
	    int n=L.length;
        for(int i=0;i<n;i++){
            printf("%d ",L.elem[i]);
        }
}
//合并序列 
Status MergListe_Sq(SqList *La, SqList *Lb, SqList *Lc)
{
    
    int i=0, j=0, k=0; 
    //同时扫描两个表 
    while(i<La->listsize && j<Lb->listsize) 
    {
        if(La->elem[i]<=Lb->elem[j]) 
        {
            Lc->elem[k] = La->elem[i]; 
            i++;         
            k++;         
        }
        else
        {
            Lc->elem[k] = Lb->elem[j];
            j++;            
            k++;         
        }
    }
    //A表扫完,B组未扫完 
    if(i==La->listsize)
	 {
        for(; j<Lb->listsize; j++)
        {
            Lc->elem[k] = Lb->elem[j];
            k++; 
        }        
    }
    if(j==Lb->listsize)              
    {
        for(; i<La->listsize; i++)
        {
            Lc->elem[k] = La->elem[i];
            k++; 
        }    
    }
    Lc->listsize=k;
      
}
//查找元素item并输出 
void lookprintf_Sq(SqList *L, ElemType item)
{
       int k=0;
       int i=0;
	   int j=-1;
	   int flag=0; 
       scanf("%d",&item); //想删除的item的元素 
       for(i=0;i<L->length;i++)
       {
       	 if (L->elem[i]==item)   
       	 {
       	 	k=i+1;
       	 	flag=1;
			}
	   }
	   if(flag==1)printf("%d",k);
	   if(flag==0)printf("%d",j);
	   
      
}
//删除数据 
Status DeleteItem_Sq (SqList *L, ElemType item)
{
   int k=0;
   int i=1; 
   scanf("%d",&item); //k记录值等于item的元素个数 
       while (i<=L->length) 
       {      if (L->elem[i]==item)   
                         k++;
	  else //当前元素前移k个位置
                  L->elem[i-k]=L->elem[i]; 
	  i++;
       }
      L->length=L->length-k;  //顺序表A的长度递减 
}
//在指定位置i插入元素e 
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{
	scanf("%d",&i);
	scanf("%d",&e);
if (i<1 || i>L->length+1)	return 0;   //i值不合法
    //在线性表L的i位置插入e
	int k;
	for (k = L->length-1; k >=i-1; k--) {
		L->elem[k + 1] = L->elem[k];
    //将i位置后面的元素都赋值到后一位	
	}
	L->elem[i - 1] = e;
	L->length++;
    //增长线性表
	return 0;
}
//在有序线性表中插入元素item 
Status ListInsert_Sq(SqList *L,ElemType item)
{
	scanf("%d",&item);
	int i;
	for(i=L->length-1;i>=0&&L->elem[i]>item;i--){
		L->elem[i+1]=L->elem[i];
	}
	L->elem[i+1]=item;
	L->length++;
	return 1;
 
}
//删第j个起的k个元素 
Status delite_Sq(SqList *L)
{
  int s;
  int t;
  
  scanf("%d",&s);
  scanf("%d",&t);
  if(s>=t)return OVERFLOW;
  if(L->elem=NULL)return OVERFLOW; 
  	for(int i=0;i<L->length;i++){
		if(L->elem[i]>=s&&L->elem[i]<=t){
			for(i;i<L->length;i++){
				L->elem[i]=L->elem[i+1];
			}
			L->length--;
			i=i-1;
		}
	}

	return true; 
	//将j位置后面的元素都赋值到前一位	
    //减少线性表

}
//找min 
void min_Sq(SqList *L)
{
  int min=-10000;
    int flag2=0;
   for(int ii=0;ii<L->length;ii++){
   	 if(L->elem[ii]<min){
   	 	flag2=ii;
   	 	min=L->elem[ii];
		}
   }
   int flag=++flag2;
   for (int k = flag; k <=L->length; k++) {
		L->elem[k - 1] = L->elem[k];
   //将flag位置后面的元素都赋值到前一位	
	}
	
	L->length--;
   //减少线性表

}
//找出并输出最大值 
  void max_Sq(SqList *L)
{
    int max=0;
    int flag1=0;
   for(int xx=0;xx<L->length;xx++){
   	 if(L->elem[xx]>max){
   	 	flag1=xx;
   	 	max=L->elem[xx];
		}
   }
   printf("%d\n",++flag1);
}
//删除指定位置i的元素并输出剩余的 
Status Delite_Sq(SqList *L,int i)
{
	scanf("%d",&i);
	int j=-1;
    if (i<1 || i>L->length)
		{printf("%d",j);}   //i值不合法,输出-1 
    else
	{//合法,线性表L的i位置删除 
	int k;
	for (k =i;k<L->length; k++) {
		L->elem[k -1] = L->elem[k];
    //将i位置后面的元素都赋值到前一位	
	}
	int flag=1;
	L->length--;//缩短线性表
	    //输出线性表 
	    int n=L->length;
        for(int i=0;i<n;i++){
            printf("%d ",L->elem[i]);
        }
}
	return 0;
}
int main()
{
        SqList La,Lb,Lc,L;
        int len1,len2,item;
        InitList_Sq(&La);
		InitList_Sq(&L);
        InputList_Sq(&La,len1);
        InitList_Sq(&Lb);
        InputList_Sq(&Lb,len2);
       MergListe_Sq (&La, &Lb, &Lc);
       lookprintf_Sq(&L,item);
	   ListInsert_Sq(&L,item); 
       DeleteItem_Sq (&L,item);
       ListInsert_Sq(&L,i,e);
       delite_Sq(&L);
       min_Sq(&L);
       max_Sq(&L);
       Delite_Sq(&L,i);
       PrintList_Sq(Lc);
       return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值