静态顺序表的c实现

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>

#define MAXSIZE 50
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

//定义顺序表的静态数组表示
typedef  struct{
ElemType data[MAXSIZE];
int length;
}SqList,*pSqList;



void Init_Sq(pSqList pSq);
void InsertFirst(pSqList pSq, ElemType);
void InsertLast(pSqList pSq, ElemType);
void TraverseList(pSqList pSq);
int ListLength(pSqList pSq);
Status ListInsert(pSqList pSq, int i, ElemType e);
Status ListDelete(pSqList pSq, int i, ElemType * e);
int LocateElem_Sq(pSqList pSq, ElemType e);
void GetElem(pSqList pSq, int i, ElemType * e);
void Union_Sq(pSqList La, SqList Lb);

int main()
{
    SqList list1;
    Init_Sq(&list1);

    int length1;
    scanf("%d",&length1);
    int i;
    ElemType e;

    for(i=0;i<length1;i++)
    {
        scanf("%d",&e);
        InsertLast(&list1, e);
    }

    printf("创建好的线性表list1=");
    TraverseList(&list1);

    printf("像表头插入一个元素:");
    scanf("%d",&e);
    InsertFirst(&list1, e);

    printf("插入一个头元素的list1=");
    TraverseList(&list1);

    printf("在线性表第i个位置前插入e,输入i(输q退出):");
    while(scanf("%d", &i))
    {
        printf("输入元素e:");
        scanf("%d", &e);
        ListInsert(&list1, i, e);
        printf("在线性表第i个位置前插入e,输入i(输q退出):");
    }
    printf("插入元素后的list1:");
    TraverseList(&list1);

    getchar();
    printf("在顺序表中删除list1中删除第i个元素,输入i(输q退出):");
    while(scanf("%d", &i))
    {
        int e;
        ListDelete(&list1, i, &e);
        printf("删除的元素是:%d\n", e);
       printf("在顺序表中删除list1中删除第i个元素,输入i(输q退出):");
    }
    printf("删除元素后的list1:");
    TraverseList(&list1);

    getchar();
    printf("\n");
    SqList list2;
    Init_Sq(&list2);

    int length2;
    scanf("%d", &length2);
    for(i=0;i<length2;i++)
    {
        scanf("%d",&e);
        InsertLast(&list2, e);
    }
    printf("创建好的线性表list2=");
    TraverseList(&list2);

    Union_Sq(&list1, list2);
    printf("list1 U list1 =");
    TraverseList(&list1);

    return 0;
}

//初始化顺序表
void Init_Sq(pSqList pSq)
{
    assert(pSq);  //判断是否开辟结构体空间

//把线性表的每个元素初始化为0

//方法1
//  memset(pSq->data, 0, sizeof(ElemType)*MaxSize);

//方法2
//    for(i=0; i<sizeof(pSq->data)/sizeof(*pSq->data); i++)
//    {
//        pSq->data[i] = 0;
//    }
    pSq->length = 0;
}

//遍历顺序表
void TraverseList(pSqList pSq)
{
    int i;

    for(i=0; i<pSq->length; i++)
    {
        printf("%d", pSq->data[i]);
    }
    putchar('\n');
    return;
}

//求表中元素个数
int ListLength(pSqList pSq)
{
    return pSq->length;
}

//向表头插入一个元素
void InsertFirst(pSqList pSq, ElemType e)
{
    int * p, * q;

    if(pSq->length>=MAXSIZE)
    {
        exit(OVERFLOW);
    }

    q = &pSq->data[0];
    for(p=&pSq->data[pSq->length-1];p>=q;p--) //不能用于首次插入
    {
        *(p + 1) = *p;
    }
    *q = e;
    pSq->length++;
    return;
}

//向表尾插入一个元素
void InsertLast(pSqList pSq, ElemType e)
{
     if(pSq->length>=MAXSIZE)
    {
        exit(OVERFLOW);
    }
    pSq->data[pSq->length] = e;
    pSq->length++;
    return;
}

//在顺序表第i个位置之前插入新的元素e
Status ListInsert(pSqList pSq, int i, ElemType e)
{
    int * q, * p;
    if(i<1 || i>pSq->length+1) return ERROR;
    if(pSq->length>=MAXSIZE)
    {
        exit(OVERFLOW);
    }
    q = &(pSq->data[i-1]);

    for(p=&(pSq->data[pSq->length-1]);p>=q;p--)
        * (p+1) = * p;

    * q = e;
    ++pSq->length;
    return OK;
}

//删除第i个元素,并返回其值
Status ListDelete(pSqList pSq, int i, ElemType * e)
{
    int * p, *q;
    if((i<1) || (i>pSq->length)) return ERROR;
    p = &(pSq->data[i-1]);
    *e = *p;
    q = pSq->data + pSq->length-1;
    for(++p; p<=q; ++p) *(p-1) = *p;
    --pSq->length;
    return OK;
}

//定位一个指定的值在线性表中的具体位置
//若找到,则返回其在顺序表中的位序
int LocateElem_Sq(pSqList pSq, ElemType e)
{
    ElemType * p;
    int i = 1;
    p = pSq->data;

    while(i<=pSq->length&&!(*p++==e)) i++;

    if(i<=pSq->length) return i;
    else return 0;
}

void GetElem(pSqList pSq, int i, ElemType* e)
{
    *e = pSq->data[i-1];
}

//求线性表La与线性表Lb的并集,
//即将所有在线性表Lb中但不在线性表La中的元素插入到La中
void Union_Sq(pSqList La, SqList Lb)
{
    int Lb_len;
    Lb_len = ListLength(&Lb);

    int i;
    for(i=1; i<=Lb_len;i++){
        int e;
        GetElem(&Lb, i, &e);
        if(!LocateElem_Sq(La, e)){
            InsertLast(La, e);
        }
    }
}


希望,下次用二分查找实现线性表具有集合属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态顺序表是一种使用数组实现的线性表,它的大小在编译时确定,不可动态改变。下面是静态顺序表的C语言实现: ```c #define MAX_SIZE 100 // 定义静态顺序表的最大容量 typedef struct { int data[MAX_SIZE]; // 用数组存储数据元素 int length; // 当前顺序表的长度 } SeqList; // 初始化顺序表 void init(SeqList *list) { list->length = 0; } // 插入元素 int insert(SeqList *list, int index, int value) { if (index < 0 || index > list->length || list->length == MAX_SIZE) { return 0; // 插入位置不合法或顺序表已满,插入失败 } for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; // 将插入位置后的元素后移一位 } list->data[index] = value; // 在插入位置插入新元素 list->length++; // 长度加1 return 1; // 插入成功 } // 删除元素 int remove(SeqList *list, int index) { if (index < 0 || index >= list->length) { return 0; // 删除位置不合法,删除失败 } for (int i = index + 1; i < list->length; i++) { list->data[i - 1] = list->data[i]; // 将删除位置后的元素前移一位 } list->length--; // 长度减1 return 1; // 删除成功 } // 获取元素 int get(SeqList *list, int index) { if (index < 0 || index >= list->length) { return -1; // 获取位置不合法,返回-1表示失败 } return list->data[index]; } // 修改元素 int modify(SeqList *list, int index, int value) { if (index < 0 || index >= list->length) { return 0; // 修改位置不合法,修改失败 } list->data[index] = value; return 1; // 修改成功 } ``` 以上是静态顺序表的简单实现,包括初始化、插入、删除、获取和修改等基本操作。你可以根据需要进行调用和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值