顺序表

#include <stdio.h>
#include <string.h>

#define MAXLEN 100  //定义顺序表的最大长度

typedef struct
{
    char key[10];   //节点的关键字
    char name[20];
    int age;
}DATA;              //定义节点类型

typedef struct      //定义顺序表结构
{
    DATA ListData[MAXLEN+1];//保存顺序表的结构数组
    int ListLen;//顺序表已存节点的数量
}SLType;

void SLInit(SLType *SL)//初始化顺序表
{
    SL->ListLen=0;//初始化为空表
}

int SLLength(SLType *SL)
{
    return (SL->ListLen);//返回顺序表的元素数量
}

int SLInsert(SLType *SL,int n,DATA data)
{
    int i;
    if(SL->ListLen>=MAXLEN)//顺序表节点数量已超过最大数量
    {
        printf("顺序表已满,不能插入节点!\n");
        return 0;
    }
    if(n<1||n>SL->ListLen-1)//插入节点序号不正确
    {
        printf("插入元素序号错误,不能插入元素!\n");
        return 0;
    }
    for(i=SL->ListLen;i>=n;i--)//将顺序表中的数据向后移动
    {
        SL->ListData[i+1]=SL->ListData[i];
    }
    SL->ListData[n]=data;//插入节点
    SL->ListLen++;//顺序表节点数量增加1
    return 1;//成功插入返回1
}

int SLAdd(SLType *SL,DATA data)//增加元素到顺序表尾部
{
    if(SL->ListLen>=MAXLEN)//顺序表已满
    {
        printf("顺序表已满,不能再添加节点了!\n");
        return 0;
    }
    SL->ListData[++SL->ListLen]=data;
    return 1;
}

int SLDelete(SLType *SL,int n)//删除顺序表中的数据元素
{
    int i;
    if(n<1||n>SL->ListLen+1)
    {
        printf("删除节点序号错误,不能删除节点!\n");
        return 0;
    }
    for(i=n;i<SL->ListLen;i++)
    {
        SL->ListData[i]=SL->ListData[i+1];
    }
    SL->ListLen--;//顺序表元素数量减1
    return 1;
}

DATA *SLFindByNum(SLType *SL,int n)//根据序号,返回数据元素
{
    if(n<1||n>SL->ListLen+1)
    {
        printf("节点序号错误,不能返回节点!\n");
        return NULL;
    }
    return &(SL->ListData[n]);
}

int SLFindByCont(SLType *SL,char *key)//按关键字查询节点
{
    int i;
    for(i=1;i<=SL->ListLen;i++)
    {
        if(strcmp(SL->ListData[i].key,key)==0)
        {
            return i;//返回节点序号
        }
    }
    return 0;
}

int SLAll(SLType *SL)//显示顺序表中的所有节点
{
    int i;
    for(i=1;i<=SL->ListLen;i++)
    {
        printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
    }
    return 0;
}

int main()
{
    int i;
    SLType SL;//定义顺序表变量
    DATA data;//定义节点保存数据类型变量
    DATA *pdata;//定义节点保存指针变量
    char key[10];//保存关键字

    printf("顺序表操作演示!\n");
    SLInit(&SL);//初始化顺序表
    printf("初始化顺序表完成!\n");

    do                  //循环添加节点数据
    {
        printf("输入添加的节点(学号 姓名 年龄):");
        fflush(stdin);//清空输入缓冲区
        scanf("%s%s%d",&data.key,&data.name,&data.age);
        if(data.age)//若年龄不为0
        {
            if(!SLAdd(&SL,data))//若添加节点失败
            {
                break;
            }
        }
        else//若年龄为0
        {
            break;
        }
    }while(1);
    printf("\n顺序表中的节点数序为:\n");
    SLAll(&SL);//显示所有节点数据

    fflush(stdin);
    printf("\n输入要取出节点的序号:");
    scanf("%d",&i);//输入节点序号
    pdata=SLFindByNum(&SL,i);//按序号查找节点
    if(pdata)//若返回的节点指针不为NULL
    {
        printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
    }
    fflush(stdin);
    printf("\n要查找的节点的关键字:");
    scanf("%s",key);
    i=SLFindByCont(&SL,key);//按关键字查找,返回节点序号
    pdata=SLFindByNum(&SL,i);//按序号查询,返回节点指针
    if(pdata)//若节点指针不为NULL
    {
        printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
    }
    getch();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值