鱼C论坛

 找回密码
 立即注册
查看: 2111|回复: 2

[技术交流] 静态顺序表的c实现

[复制链接]
发表于 2017-7-23 21:16:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
终于,自己从头到尾敲了一遍顺序表。虽然是静态顺序表,但还是挺满意的。在敲代码过程中,我对指针和结构体的了解更加深入了,还接触到了<merroy.h>,<assert.h>库函数。有时间,实现线性表有集合属性。
#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);
        }
    }
}

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
小甲鱼 + 3 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-23 22:58:38 | 显示全部楼层
不错,再接再厉!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-7-24 18:06:04 | 显示全部楼层
小甲鱼 发表于 2017-7-23 22:58
不错,再接再厉!

蟹蟹大佬鼓舞。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表