《数据结构》---线性表的顺序表示与实现

本程序在CodeBlocks运行通过,博客结尾附有下载链接。
在main.c中需要调用func2-2.h头文件。
注:由于在main.c中要打印一些特殊类型的数据,为了不频繁使用printf()函数,所以在func2-2.h中定了了一些print()用户自定义函数,方便进行数据的比较与打印等等操作。

func2-2.h

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;

Status equal(ElemType e1,ElemType e2)
{//判断是否相等函数
    if(e1 == e2)
        return OK;
    else
        return FALSE;
}

int com(ElemType e1,ElemType e2)//返回值是int型
{//根据a<、=或>b,分别返回-1、0或1
    if(e1 == e2)
        return 0;
    else
        return (e1 - e2)/ (abs(e1 - e2));
}

void print(ElemType e)
{//以十进制整型的格式输出元素的值
    printf("%d",e);
}

void print1(ElemType &e)
{//以十进制整型的格式输出元素的值(设C为引用类型)
    printf("%d ",e);
}

void print2(ElemType e)
{//以字符型的格式输出元素的值
    printf("%c",e);
}

main.c

#include <stdio.h>
#include <malloc.h>
#include "func2-2.h"
#include <stdlib.h>
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
#define N 10

typedef struct
{
    ElemType *elem;//elem为指针变量,存储的是顺序表L的基地址
    int length;
    int listsize;
}Sqlist;

//func2-2函数调用声明
void print1(ElemType &e);
Status equal(ElemType e1,ElemType e2);

//本文件函数声明

void InitSqlist_Sq(Sqlist &L);
void Destroy_Sq(Sqlist &L);
void Clear_Sq(Sqlist &L);
Status ListEmpty_Sq(Sqlist L);
int ListLength_Sq(Sqlist L);
Status GetElem_Sq(Sqlist L,int i,ElemType &e);
int Locate_Sq(Sqlist L,ElemType e,Status (* compare)(ElemType,ElemType));//compare()函数
Status PriorElem_Sq(Sqlist L,ElemType cur_e,ElemType &pre_e);
Status NextElem_Sq(Sqlist L,ElemType cur_e,ElemType &next_e);
Status ListInsert_Sq(Sqlist &L,int i,ElemType e);
Status ListDelete_Sq(Sqlist &L,int i,ElemType &e);
Status ListTraverse_Sq(Sqlist L,void(* visit)(ElemType &e));

//主函数
int main()
{
    Sqlist L;
    int e,e1,i,j,k,m,pre_e,next_e,ins_e,del_e;
    //Status flag;
    InitSqlist_Sq(L);
    printf("初始化L表后,L.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);//%p用于输出L.elem在内存中的地址
    for(i = 1; i <= N; i++)
        ListInsert_Sq(L,1,i);
    printf("L表中的元素为:");
    ListTraverse_Sq(L,print1);

    printf("请输入需要查询L表中第j个元素(1<=j<=%d):",L.length);
    scanf("%d",&j);
    while(j<1 || j>L.length)
    {
        printf("超出范围!请重新输入!\n");
        printf("请输入需要查询L表中第j个元素(1<=j<=%d):",L.length);
        scanf("%d",&j);
    }
    GetElem_Sq(L,j,e);
    printf("L表中第%d个元素的值为:%d\n",j,e);

    printf("查询L表中第几个元素的前一个元素[2,%d]:",L.length);
    scanf("%d",&j);
    while(j<2 || j>L.length)
    {
        printf("超出范围!请重新输入!\n");
        printf("查询L表中第几个元素的前一个元素[2,%d]:",L.length);
        scanf("%d",&j);
    }
    GetElem_Sq(L,j,e);
    PriorElem_Sq(L,e,pre_e);
    printf("第%d个元素为%d,它的前一个元素是:%d\n",j,e,pre_e);

    printf("查询L表中第几个元素的后一个元素[1,%d]:",L.length-1);
    scanf("%d",&j);
    while(j<1 || j>L.length-1)
    {
        printf("超出范围!请重新输入!\n");
        printf("查询L表中第几个元素的后一个元素[1,%d]:",L.length-1);
        scanf("%d",&j);
    }
    GetElem_Sq(L,j,e);
    NextElem_Sq(L,e,next_e);
    printf("第%d个元素为%d,它的后一个元素是:%d\n",j,e,next_e);

    printf("请输入想要在L中匹配的数:",e1);
    scanf("%d",&e1);
    k = Locate_Sq(L,e1,equal);
    if(k)//k不为零,说明L中存在与e1匹配的数
        printf("第%d个数与%d匹配!\n",k,e1);
    else//否则说明不存在与e1匹配的数
        printf("L中不存在与%d匹配的数!\n",e1);

    printf("请输入在第几个元素之前插入[1,%d]:",L.length+1);
    scanf("%d",&j);
    while(j<0 || j>L.length+1)
    {
        printf("超出范围!请重新输入!\n");
        printf("请输入在第几个元素之前插入[1,%d]:",L.length+1);
        scanf("%d",&j);
    }
    printf("输入将要插入的元素:");
    scanf("%d",&ins_e);
    printf("在第%d个元素之前插入元素%d\n",j,ins_e);
    ListInsert_Sq(L,j,ins_e);
    printf("插入元素后,L表为:");
    ListTraverse_Sq(L,print1);

    printf("请输入要删除第几个元素?m = ");
    scanf("%d",&m);
    while(m<1 || m>L.length)
    {
        printf("超出范围,请重新输入:\n");
        printf("请输入要删除第几个元素?m = ");
        scanf("%d",&m);
    }
    printf("删除第%d个元素\n",m);
    if(ListDelete_Sq(L,m,del_e))
    {
        printf("删除元素为:%d\n",del_e);
        printf("删除元素成功!\n");
    }

    printf("删除元素之后,L表为:");
    ListTraverse_Sq(L,print1);

    printf("清空前,L表信息为:L.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
    Clear_Sq(L);
    printf("顺序表L已经被清空!\nL.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
    Destroy_Sq(L);
    printf("顺序表L已经被销毁!\nL.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
    return 0;
}


//函数实现
void InitSqlist_Sq(Sqlist &L)
{
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
        exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return;
}

void Destroy_Sq(Sqlist &L)
{
    free(L.elem);
    L.elem = NULL;
    L.length = 0;
    L.listsize =0;
}

void Clear_Sq(Sqlist &L)
{
    L.length = 0;//不是int L.length = 0,直接令L.length = 0即可
}

Status ListEmpty_Sq(Sqlist L)
{
    if(L.length == 0)
        return OK;//注意:在程序中,返回用OK-ERROR组合和TRUE-FALSE组合都可以,根据语境进行判断
    else
        return ERROR;
}

int ListLength_Sq(Sqlist L)
{
    return L.length;
}

Status GetElem_Sq(Sqlist L,int i,ElemType &e)
{
    if(i<1||i>L.length)
        return ERROR;
    e = *(L.elem + i - 1);//等价于 e = L.elem[i-1];
    return OK;
}

int Locate_Sq(Sqlist L,ElemType e,Status (* compare)(ElemType,ElemType))//compare()函数
{
    int i = 1;
    ElemType *p = L.elem;
    while( i<=L.length && !compare(*(p++),e))//重要:在这一行,*(p++) = *p++;
       i++;
    if(i<=L.length)
        return i;
    else
        return 0;
}

Status PriorElem_Sq(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
    int i = 2;
    ElemType *p = L.elem + 1;
    while(i<=L.length && *p != cur_e)//注意这儿是while循环,不是if判断语句
    {
        p++;
        i++;
    }
    if(i>L.length)
        return ERROR;
    else
        {
            pre_e = *(--p);//等价于pre_e = * --p;
            return OK;
        }
}

Status NextElem_Sq(Sqlist L,ElemType cur_e,ElemType &next_e)
{
    int i = 1;
    ElemType *p = L.elem;
    while(i<L.length && *p != cur_e)//寻找后继元素,i的范围需要小于表长,最大只能到达倒数倒数第二个,因此不能写 i<=L.length
    {                               //注意这儿是while循环,不是if判断语句
        p++;
        i++;
    }
    if(i==L.length)//i = L.length的时候就结束了上边的if-else循环,此时i = L.length
        return ERROR;
    else
    {
        next_e = *(++p);//等价于next_e = * ++p;
        return OK;
    }
}

Status ListInsert_Sq(Sqlist &L,int i,ElemType e)
{
    ElemType *newbase,*p,*q;
    if(i<1 || i>L.length+1)//这条语句说明也可以在表尾插入一个元素
        return ERROR;
    if(L.listsize == L.length)
    {
        newbase = (ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
        if(!newbase)//!newbase 等价于 NULL == newbase
            return ERROR;
        L.elem = newbase;
        L.listsize += LIST_INCREMENT;
    }
    p = L.elem + i - 1;//把第i个元素的地址存到p中
    for(q=L.elem+L.length-1; q>=p; q--)
        *(q+1) = *q;
    *p = e;
    ++L.length;
    return OK;
}

Status ListDelete_Sq(Sqlist &L,int i,ElemType &e)
{
    ElemType *p;
    if(i<1 || i>L.length)
        return ERROR;
    e = *(L.elem + i - 1);
    for(p = L.elem + i - 1; p <= L.elem + L.length - 1; p++)
        *p = *(p+1);
    L.length--;
    return OK;
}

Status ListTraverse_Sq(Sqlist L,void(* visit)(ElemType &e))
{
    ElemType *p = L.elem;
    int i;
    for(i = 1; i <= L.length; i++)
        visit(*p++);
    printf("\n");
    return OK;
}

源码:http://download.csdn.net/detail/u013383042/9623543
原创:http://blog.csdn.net/u013383042/article/details/52453320

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值