线性表的顺序存储------顺序表

一丶顺序表
概念:采用顺序存储的线性表称为顺序表,顺序表中逻辑上相邻的数据元素在物理存储位置上也是相邻的。
二丶定义顺序表
用一维数组来描述顺序表的数据存储。由于顺序表有插入删除等操作,即顺序表的表长会发生改变。因此是数组长度足够大,加入整型变量length来记录此时线性表中数据元素的个数,顺序表的结构如下:

#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
    ElemType elem[MAXSIZE];    //数据域
    int length;    //顺序表的长度
}SeqList;

三丶顺序表的初始化
顺序的初始化即构造一个空表,将表长length设置为0,表示没有存储数据(0号单元不存值)。

SeqList *Init_SeqList()
{
    SeqList *L = (SeqList *)malloc(sizeof(SeqList));
    L->length = 0;
    return L;
}

四丶顺序表的插入
顺序表的插入是指在表的第 i 个位置插入一个新元素 x,插入后是表长加1。并要注意插入的位置是否正常和此时的表是否已经满了。

int In_SeqList(SeqList *L,int i,ElemType x)
{
    int j;
    if(L->length == MAXSIZE-1)
    {
        printf("顺序表已经满了\n");
        return FALSE;
    }
    if(i<1 || i>L->length+1)
    {
        printf("插入的位置有问题\n");
        return FALSE;
    }
    for(j=L->length ; j>=i ; j--)
        L->elem[j+1] = L->elem[j];
    L->elem[i] = x;
    L->length++;
    return TRUE;
}

五丶顺序表的删除
顺序表的删除是指将表中的第 i 个元素从顺序表中删除,删除后使表长减1。注意删除的位置是否正确和此时的表是否为空。

int Delete_SeqList(SeqList *L,int i)
{
    int j;
    if(i<1 || i>L->length)
    {
        printf("不存在第%d个元素\n",i);
        return FALSE;
    }
    for(j=i ; j<=L->length-1;j++)
        L->elem[j] = L->elem[j+1];
    L->length--;
    return TRUE;
}

六丶顺序表的查找
在顺序表中查找给定元素x相同的值,找到返回x在表中的位置,否则返回FALSE;

int Search_SeqList(SeqList *L,ElemType x)
{
    int i=1;
    while(i<=L->length && L->elem[i]!=x)
        i++;
    if(i > L->length)
        return FALSE;
    else
        return i;
}

七丶两个顺序表合并
两个顺序表A和B,其元素均按从大到小排列,然后将这两个顺序表合并成一个顺序表C,要求C也是按从大到小的顺序排列。

void Merge_SeqList(SeqList *A,SeqList *B,SeqList *C)
{
    int i,j,k;
    i=j=k=1;
    while(i<=A->length && j<B->length)
    {
        if(A->elem[i]<B->elem[j])
            C->elem[k++] = A->elem[i++];
        else
            C->elem[k++] = B->elem[j++];
    }
    while(i <= A->length)
        C->elem[k++] = A->elem[i++];
    while(j <= B->length)
        C->elem[k++] = B->elem[j++];
    C->length = A->length + B->length;
}

总代码

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100

typedef int ElemType;

typedef struct
{
    ElemType elem[MAXSIZE];    //数据域
    int length;                //顺序表的长度
}SeqList;
//顺序表的初始化
SeqList *Init_SeqList()
{
    SeqList *L = (SeqList *)malloc(sizeof(SeqList));
    L->length = 0;
    return L;
}
//顺序表的插入
int In_SeqList(SeqList *L,int i,ElemType x)
{
    int j;
    if(L->length == MAXSIZE-1)
    {
        printf("顺序表已经满了\n");
        return FALSE;
    }
    if(i<1 || i>L->length+1)
    {
        printf("插入的位置有问题\n");
        return FALSE;
    }
    for(j=L->length ; j>=i ; j--)
        L->elem[j+1] = L->elem[j];
    L->elem[i] = x;
    L->length++;
    return TRUE;
}
//顺序表的删除
int Delete_SeqList(SeqList *L,int i)
{
    int j;
    if(i<1 || i>L->length)
    {
        printf("不存在第%d个元素\n",i);
        return FALSE;
    }
    for(j=i ; j<=L->length-1;j++)
        L->elem[j] = L->elem[j+1];
    L->length--;
    return TRUE;
}
//顺序表的查找
int Search_SeqList(SeqList *L,ElemType x)
{
    int i=1;
    while(i<=L->length && L->elem[i]!=x)
        i++;
    if(i > L->length)
        return FALSE;
    else
        return i;
}
//两个顺序表的合并
void Merge_SeqList(SeqList *A,SeqList *B,SeqList *C)
{
    int i,j,k;
    i=j=k=1;
    while(i<=A->length && j<B->length)
    {
        if(A->elem[i]<B->elem[j])
            C->elem[k++] = A->elem[i++];
        else
            C->elem[k++] = B->elem[j++];
    }
    while(i <= A->length)
        C->elem[k++] = A->elem[i++];
    while(j <= B->length)
        C->elem[k++] = B->elem[j++];
    C->length = A->length + B->length;
}
//输出顺序表中的数据
void Show_SeqList(SeqList *L)
{
    int i;
    for(i=1;i<=L->length;i++)
    {
        printf("%d  ",L->elem[i]);
        if(i%15 == 0)
            printf("\n");
    }
    printf("\n");
}
void print()
{
    printf("1.插入数据\n");
    printf("2.删除数据\n");
    printf("3.查找数据\n");
    printf("4合并两个顺序表\n");
    printf("0.退出\n");
    printf("请输入你要执行的操作:");
}
//测试函数
void Try_SeqList()
{
    SeqList *L;
    SeqList *A,*B,*C;
    int i,x,choose;
    L = Init_SeqList();
    for(i=1 ; i<=10 ; i++)
        In_SeqList(L,i,i);
    printf("顺序表L的初始值为:");
    Show_SeqList(L);
    do 
    {
        print();
        scanf("%d",&choose);
        switch ( choose )
        {
        case 1:
            printf("请输入你要插入的位置和值:");
            scanf("%d%d",&i,&x);
            In_SeqList(L,i,x);
            printf("插入数据后,顺序表L的值为:");
            Show_SeqList(L);
            break;
        case 2:
            printf("请输入你要删除的位置:");
            scanf("%d",&i);
            Delete_SeqList(L,i);
            printf("删除数据后,顺序表L的值为:");
            Show_SeqList(L);
            break;
        case 3:
            printf("请输入你要查找的数据:");
            scanf("%d",&x);
            printf("%d在第%d个\n",x,Search_SeqList(L,x));
            break;
        case 4:
            A = Init_SeqList();
            B = Init_SeqList();
            C = Init_SeqList();
            In_SeqList(A,1,1);
            In_SeqList(A,2,3);
            In_SeqList(A,3,5);
            In_SeqList(A,4,7);
            printf("A : ");
            Show_SeqList(A);
            In_SeqList(B,1,2);
            In_SeqList(B,2,4);
            In_SeqList(B,3,6);
            In_SeqList(B,4,8);
            printf("B : ");
            Show_SeqList(B);
            printf("合并A和B\n");
            Merge_SeqList(A,B,C);
            printf("C : ");
            Show_SeqList(C);
            break;
        case 0:
            return ;
        default:
            printf("你的选择有误!!!\n");
        }
        printf("按任意键继续……");
        getchar();
        getchar();
    } while (choose != 0);
}
int main(void)
{
    Try_SeqList();
    return 0;
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值