线性表——创建、插入、删除、查找

来源:互联网 发布:国家顶级域名 编辑:程序博客网 时间:2024/05/17 22:37

#include <stdio.h>

#include <stdlib.h>

#define LIST_INIT_SIZE 100//初始分配量

#define LISTINCREMENT 10//分配增量

#define OK 1

#define ERROR 0

typedef struct

{

    int *elem;//存储空间基址

    int len;//当前长度

    int listsize;//当前分配的存储容量(以sizeof(int)为单位)

}SqList;

//初始化线性表

int InitList_Sq(SqList *L)

{

    //使用malloc函数,申请一段连续的存储空间

    L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));

    if(!L->elem) exit(0);//存储分配失败

    L->len=0;//空表长度为0

    L->listsize=LIST_INIT_SIZE;//初始存储容量

    return OK;

}

//向线性表中插入数据

int ListInsert_Sq(SqList *L,int i,int e)

{

    if(i<1||i>L->len+1)

        return ERROR;//插入位置不对,退出

    if(L->len>=L->listsize)//当前空间不够

    {

        //使用realloc函数,在原本的基地址上申请更大的存储空间

        int *newbase=(int *)realloc(L->elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(int));//新基址

        //如果申请空间失败则结束程序

        if(!newbase) exit(0);

        L->listsize+=LISTINCREMENT;//增加存储容量

    }

    int *q=&(L->elem[i-1]);//插入位置

    int *p;

    for(p=&L->elem[L->len-1];p>=q;--p)//p指向最后一个位置然后依次向前

        *(p+1)=*p;//插入位置元素及之后元素后移

    *q=e;//插入e

    ++L->len;//表长度+1

    return OK;

}

//删除线性表中的数据

int ListDelete_Sq(SqList *L,int i,int *e)

{

    if(i<1||i>L->len)

        return ERROR;//删除位置不对,退出

    int *p=&(L->elem[i-1]);//删除元素的位置

    *e=*p;//被删除元素的值赋给e

    int *q=L->elem+L->len-1;//表尾元素位置

    for(++p;p<=q;++p)

        *(p-1)=*p;//被删除元素之后的元素左移

    L->len--;//表长度-1

    return OK;

}

//输出线性表中的数据

int ListSearch_Sq(SqList *L,int *e)

{

    int i=1;

    int *p=L->elem;

    while(i<=L->len&&!(*p==*e))

    {

        i++;

        p++;

    }

    if(i<=L->len)

        return i;

    else

        return 0;

}

void ListShow_Sq(SqList *L)

{

    int i;

    for(i=0;i<L->len;i++)

    {

        printf("%d ",L->elem[i]);

    }

    printf("\n");

}

int main()

{

    int i;

    SqList L;

    InitList_Sq(&L);

    int n;

    printf("原始数据个数是:");

    scanf("%d",&n);

    printf("输入线性表中%d个原始数据:",n);

    for(i=0;i<n;i++)

    {

        int t;

        scanf("%d",&t);

        ListInsert_Sq(&L,L.len+1,t);

    }

    printf("原始数据为:");

    ListShow_Sq(&L);

    while(1)

    {

        printf("1:插入     2:删除     3:查找     0:退出\n");

        printf("输入你的选择:");

        int xuan;

        scanf("%d",&xuan);

        int t,shu;

        if(xuan==1)

        {

            printf("请输入数据插入的位置t和数值shu");

            scanf("%d%d",&t,&shu);

            printf("%s",ListInsert_Sq(&L,t,shu)?"插入成功.\n":"插入失败.\n");

            printf("插入后:");

            ListShow_Sq(&L);

        }

        if(xuan==2)

        {

            printf("请输入数据删除的位置t :");

            scanf("%d",&t);

            if(ListDelete_Sq(&L,t,&shu))

                printf("删除成功.删除的数据是:%d\n",shu);

            else

                printf("删除失败.位置有误.");

            printf("删除后:");

            ListShow_Sq(&L);

        }

        if(xuan==3)

        {

            printf("请输入要查找的数据shu :");

            scanf("%d",&shu);

            if(ListSearch_Sq(&L,&shu))

                printf("查找成功.查找的数据位置是:%d\n",ListSearch_Sq(&L,&shu));

            else

                printf("查找失败.没有此数据.\n");

        }

        if(xuan==0)

            break;

    }

    return 0;

}

阅读全文
1 1
原创粉丝点击