线性表

来源:互联网 发布:剑三莫雨捏脸数据截图 编辑:程序博客网 时间:2024/06/07 03:02

线性表的操作

  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));}
原创粉丝点击