线性表的操作

头文件部分
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100  //定义线性表的最大长度
typedef struct    //定义顺序表结构
{
    DATA ListData[MAXSIZE+1]; //保存顺序表的数组 
    int ListLen;              //顺序表已存结点 的数量 
}SeqListType;
//下边为线性表操作的声明
void SeqListInit(SeqListType *SL); //初始化顺序表
int SeqListLength(SeqListType *SL);  //返回顺序表的元素数量 
int SeqListAdd(SeqListType *SL,DATA data); //向顺序表中添加元素 
int SeqListInsert(SeqListType *SL,int n,DATA data); //向顺序表中插入元素 
int SeqListDelete(SeqListType *SL,int n);  //删除顺序表中的据元素 
DATA *SeqListFindByNum(SeqListType *SL,int n);  //根据序号返回元素
int SeqListFindByCont(SeqListType *SL,char *key); //按关键字查找 
int SeqListAll(SeqListType *SL);//遍历顺序表中的内容 
操作函数部分
void SeqListInit(SeqListType *SL) //初始化顺序表
{
    SL->ListLen=0;     //初始化时,设置顺序表长度为0 
} 
int SeqListLength(SeqListType *SL)  //返回顺序表的元素数量 
{
    return (SL->ListLen);    
}
int SeqListAdd(SeqListType *SL,DATA data)  //增加元素到顺序表尾部
{
    if(SL->ListLen>=MAXSIZE)  //顺序表已满 
    {
        printf("顺序表已满,不能再添加结点了!\n");
        return 0;    
    }
    SL->ListData[++SL->ListLen]=data;
    return 1;
} 
int SeqListInsert(SeqListType *SL,int n,DATA data)
{
    int i;
    if(SL->ListLen>=MAXSIZE)   //顺序表结点数量已超过最大数量 
    {
        printf("顺序表已满,不能插入结点!\n");
        return 0;             //返回0表示插入不成功 
    }
    if(n<1 || n>SL->ListLen-1)  //插入结点序号不正确
    {
        printf("插入元素序号错误,不能插入元素!\n");
        return 0;              //返回0,表示插入不成功 
    } 
    for(i=SL->ListLen;i>=n;i--)  //将顺序表中的数据向后移动 
        SL->ListData[i+1]=SL->ListData[i]; 
    SL->ListData[n]=data;        //插入结点 
    SL->ListLen++;               //顺序表结点数量增加1 
    return 1;                   //返回成功插入  
}
int SeqListDelete(SeqListType *SL,int n)  //删除顺序表中的数据元素 
{
    int i;
    if(n<1 || n>SL->ListLen+1)  //删除元素序号不正确
    {
        printf("删除结点序号错误,不能删除结点!\n");
        return 0;              //返回0,表示删除不成功 
    } 
    for(i=n;i<SL->ListLen;i++)  //将顺序表中的数据向前移动 
        SL->ListData[i]=SL->ListData[i+1]; 
    SL->ListLen--;               //顺序表元素数量减1 
    return 1;                   //返回成功删除  
}
DATA *SeqListFindByNum(SeqListType *SL,int n)  //根据序号返回数据元素
{
    if(n<1 || n>SL->ListLen+1)  //元素序号不正确
    {
        printf("结点序号错误,不能返回结点!\n");
        return NULL;              //返回0,表示不成功 
    } 
    return &(SL->ListData[n]);
} 
int SeqListFindByCont(SeqListType *SL,char *key)  //按关键字查询结点 
{
    int i;
    for(i=1;i<=SL->ListLen;i++)
        if(strcmp(SL->ListData[i].key,key)==0)  //如果找到所需结点 
            return i;        //返回结点序号 
    return 0;  //遍历后仍没有找到,则返回0 
}
主函数部分
#include <stdio.h>
typedef struct
{
    char key[15];  //结点的关键字 
    char name[20];
    int age;
} DATA;    //定义结点类型,可定义为简单类型,也可定义为结构
#include "2-1 SeqList.h"
#include "2-2 SeqList.c"
int SeqListAll(SeqListType *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);
}
int main()
{
int i;
    SeqListType SL;         //定义顺序表变量 
    DATA data,*data1;       //定义结点保存数据类型变量和指针变量 
    char key[15];           //保存关键字 
    SeqListInit(&SL);       //初始化顺序表 
    do {                    //循环添加结点数据 
        printf("输入添加的结点(学号 姓名 年龄):"); 
        fflush(stdin);              //清空输入缓冲区 
        scanf("%s%s%d",&data.key,&data.name,&data.age); 
        if(data.age)                                    //若年龄不为0 
        {
            if(!SeqListAdd(&SL,data))                   //若添加结点失败 
                break;                                  //退出死循环 
        }else   //若年龄为0 
            break;          //退出死循环 
    }while(1);
    printf("\n顺序表中的结点顺序为:\n");
    SeqListAll(&SL);                     //显示所有结点数据 

    fflush(stdin);                       //清空输入缓冲区 
    printf("\n要取出结点的序号:");
    scanf("%d",&i);                 //输入结占点序号    
    data1=SeqListFindByNum(&SL,i);  //按序号查找结点 
    if(data1)                       //若返回的结点指针不为NULL 
        printf("第%d个结点为:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);

    fflush(stdin);                                                             //清空输入缓冲区 
    printf("\n要查找结点的关键字:");
    scanf("%s",key);  //输入关键字     
    i=SeqListFindByCont(&SL,key);      //按关键字查找 ,返回结点序号 
    data1=SeqListFindByNum(&SL,i);     //按序号查询,返回结点指针 
    if(data1)                          //若结点指针不为NULL 
        printf("第%d个结点为:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);           
   getch();
return 0;
}

这里才是自己些的
 //这个文件可以直接赋值到C++中执行
#include <stdio.h>   //头文件 不用理他
#include <string.h>
typedef struct    //定义数据的内容
{ 
    char id[15];   
    char name[20];
    int age;
} DATA;
typedef struct     //定义顺序表
{
    DATA ListData[101];  //保存数据的数组 
    int ListLen;         //顺序表的元素个数 
}SeqListType;
void main()    //主函数
{   
 SeqListType SL;  //生成一个顺序表格式的变量SL
 SeqListType *p;  //生成一个顺序表格式的指针p
 p=&SL;           //让这个指针指向SL顺序表   这样的话你就可以把p当成我们的顺序表
    DATA data,data1;     //生成2个数据格式的变量 data和data1
 p->ListLen=0;    //初始阶段顺序表的元素个数为0
//增!!!!!!!!!!!(增加元素)
  do {                    //循环 添加元素 
        printf("输入添加的结点(学号 姓名 年龄):"); 
        fflush(stdin);              //清空输入缓冲区 不要管他
        scanf("%s%s%d",&data.id,&data.name,&data.age); //输入的值存在data变量中
        if(data.age)                                    //这个if是为了不让它无限循环
        {//如果年龄不为0就循环
            p->ListData[++p->ListLen]=data;//把上边输入的元素添加到第1个元素中 同时元素数+1
        }else   //若年龄为0 
            break;          //退出死循环 
    }while(1);
  printf("\n顺序表增加后为:\n");//输出增加之后的表 以便检测错误
  for(int i=1;i<=p->ListLen;i++)//循环1到现在的元素个数 简单书就是遍历表
     printf("(%s,%s,%d)\n",p->ListData[i].id,p->ListData[i].name,p->ListData[i].age);//输出当前个数的值 因为是一个for循环每次会不一样
  fflush(stdin);//不要管他
  int n;//后边用...

//删!!!!!!
 printf("请输入需要删除元素位置:");
 scanf("%d",&n);//把输入的值 赋值给n
 for(int c=n;c<p->ListLen;c++)//循环第n个元素 到最后一个元素
  p->ListData[c]=p->ListData[c+1];//把从n+1每一个元素向前移一位 
 printf("删除之后的表为:\n");//输出删除之后的表 以便检测错误
  for(int d=1;d<p->ListLen;d++)
     printf("(%s,%s,%d)\n",p->ListData[d].id,p->ListData[d].name,p->ListData[d].age);
 fflush(stdin);
//所谓的删除其实就是用后边的把它覆盖。

//改!!!!!!!
  printf("更改第几号元素:学号 姓名 年龄");
  scanf("%d %s %s %d",&n,&data.id,&data.name,&data.age);
         p->ListData[n]=data;        //赋值给n元素

 printf("\n顺序表更改之后为:\n");//输出更改之后的表 以便检测错误
  for(int b=1;b<p->ListLen;b++)
        printf("(%s,%s,%d)\n",p->ListData[b].id,p->ListData[b].name,p->ListData[b].age);
 fflush(stdin);
//所谓的更改就是重新赋值

//查!!!!!!!!!!
  printf("要查看第几号元素:");
  scanf("%d",&n);
  printf("(%s,%s,%d)\n",p->ListData[n].id,p->ListData[n].name,p->ListData[n].age);
//所谓的查 就是输出第n个元素

 //插入!!!!!
  printf("插入第几号元素:学号 姓名 年龄");
  scanf("%d %s %s %d",&n,&data.id,&data.name,&data.age);
   for(int a=p->ListLen;a>=n;a--)  //循环最后一个元素到第n个元素
        p->ListData[a+1]=p->ListData[a]; //将顺序表中的数据向后移动
    p->ListData[n]=data;        //给第n个元素赋值 
 printf("\n顺序表插入之后为:\n");//输出插入之后的表 以便检测错误
 for(int q=1;q<=p->ListLen;q++)
     printf("(%s,%s,%d)\n",p->ListData[q].id,p->ListData[q].name,p->ListData[q].age);
 fflush(stdin);
//所谓的插入元素就是把元素都向后移一位 再把那个腾出来的位置赋值
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值