线性表

线性表的操作

  1. 建立新的线性表
  2. 给线性表赋初始值
  3. 删除表中某个元素
  4. 将某个元素插入表中
  5. 将两个顺序表进行升序合并
    可运行代码如下:
/*
    Name: 线性表 
    Copyright: 
    Author: Anderson 
    Date: 04/09/17 20:48
    Description: linear_list; 
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
//头文件 
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0 
#define INFEASIBLE -1
#define OVERFLOW   -2


#define LIST_INIT_SIZE    100//线性表初始空间分配量 
#define LISTINCREMENT      10//线性表空间分配的增量
//宏定义 
typedef int Status;
typedef int ElemType;
//定义类型 
typedef struct LNode
{
    ElemType *elem;//储存空间的基地址 
    int length;//当前的长度 
    int listsize;//当前分配的储存容量 
}SqList;
//结构体 
Status initList(SqList &L,int length)// 构造空的线性表 
{

    L.elem =(ElemType *)malloc(length *sizeof(ElemType));//动态分配储存空间 
    if(!L.elem )
    exit (OVERFLOW);//如果 分配失败,退出 
    L.length =0;//初始长度为0; 
    L.listsize =length;//初始储存容量为100return OK;
}

Status insertList(SqList &L,ElemType e,int i)//插入操作,在第i位置 
{
    ElemType *p,*q;
    if(i<1||i>L.length+1 )//判断i的正确性 
    return ERROR;//不正确就结束 
    if(L.length >=L.listsize)
    {
        ElemType *newbase=(ElemType *)realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
        exit(OVERFLOW);//分配失败 
        L.elem =newbase;//成功后,分配新基值 
        L.listsize +=LISTINCREMENT;//增加储存容量 
    }
    q=&L.elem [i];//q 为插入的位置 
    for(p=&(L.elem [L.length]);p>=q;--p)
    {

        *(p+1)=*(p);
    }
    *q=e;
    ++L.length;

    return OK;
}

Status deleteListElem(SqList &L,int i,ElemType &e)
{
    int *p,*q;
    if(i<1||i>L.length )
    return ERROR;
    q=&L.elem [i];
    e=*q;
    for(p=q;p<(L.elem +L.length);p++)
    {
        *(p)=*(p+1);
    }
    L.length--;
    return OK;
}

void mergeList(SqList La,SqList Lb,SqList &Lc)
{
    ElemType *pa,*pb,*pc;
    Lc.listsize =La.length+Lb.length;

    initList(Lc,Lc.listsize );
    Lc.length =Lc.listsize ;
    pc=Lc.elem +1;
    pa=La.elem +1;
    pb=Lb.elem +1;
    while(pa<=&La.elem [La.length ]&&pb<=&Lb.elem [Lb.length])
    {
        if(*pa<=*pb)
        *pc++=*pa++;
        else
        *pc++=*pb++;
    }
    while(pa<=&La.elem [La.length ]) *pc++=*pa++;
    while(pb<=&Lb.elem [Lb.length ]) *pc++=*pb++;
}

int cmp(int x,int y)
{
    return x==y;
}

int Locate(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
    int i=0;
    ElemType *p;
    p=L.elem ;
    while(i<=L.length &&!(*compare)(*p++,e))
    ++i;
    if(i<L.length )return i;
    else return 0;
}


void printList (SqList L,int p)
{
    if(p==1)
    {
        printf("当前值:");
        for(int i=1;i<=L.length ;i++)
        {
            printf("%d ",*(L.elem +i));
        }
        printf("\n");
    }
    else if(p==2)
    {
        printf("删除后:");
        for(int i=1;i<=L.length ;i++)
        {
            printf("%d ",*(L.elem +i));
        }
        printf("\n");
    }
    else if(p==3)
    {
        printf("插入后:");
        for(int i=1;i<=L.length ;i++)
        {
            printf("%d ",*(L.elem +i));
        }
        printf("\n");
    } 
    else if(p==4)
    {
        printf("顺序表合并:");
        for(int i=1;i<=L.length ;i++)
        {
            printf("%d ",*(L.elem +i));
        }
        printf("\n");
    }

}

main()
{
    SqList La,Lb,Lc;
    ElemType e;
    int init,i;
    init=initList(La,LIST_INIT_SIZE);

    int data[6]={1,2,3,4,5,6};
    for(i=0;i<6;i++)
    {
        insertList(La,data[i],i+1);
    }
    printf("LA:\r\n");
    printList(La,1);
    deleteListElem(La,6,e);
    printList(La,2);

    insertList(La,e,6);

    printList(La,3);

    printf("LB:\r\n");

    initList(Lb, LIST_INIT_SIZE); 

    int Bdata[5] = {5,6,7,8,9};  
    for (i=0; i<5;i++)
    {
        insertList(Lb,  Bdata[i],  i+1);
    }
    printList(Lb,1);


    mergeList(La, Lb,  Lc); 

    printList(Lc,4);
    printf("locate==%d\n",Locate(Lc,4,cmp));

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值