C语言数据结构顺序表的操作(创建、插入、删除、查询)

*顺序表的相关操作
*创建顺序表(顺序存储)
*创建数组
*在指定位置进行删除
*在指定位置进行插入
*返回指定位置的数据
*返回数据的指定位置
*遍历顺序表的数据
*/

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define  MAXSIZE 1024//顺序表的数据最大数目
#define NAME_SIZE 255//字符串的最大长度
#define ERROR 0
#define OK 1
typedef  int Statu;//函数返回值的数据类型
typedef  char *NameTye;//数据名称的数据类型
typedef int IdType;//数据的编号的数据类型
typedef struct elementtype
{
    NameTye  name;//数据的名称
    IdType id;//数据的编号
}ElementType;//数据域的结构体类型

typedef struct Seq_List
{
       ElementType *data;//顺序表指针进行动态赋储存空间
       int last;//指向数据下标的指针(类似指针)

}Seq_List;//顺序表的结构体类型
void Init_seqlist(Seq_List*s);//对顺序表进行初始化
Statu create_seqlist(Seq_List*s);//对顺序表进行创建
int delet_position(Seq_List*s,int i);//在指定位置进行删除
int inset_seqlist(Seq_List*s,int i,ElementType key);//在指定位置进行插入
int search_seqlist(Seq_List*s,ElementType key);//返回数据的位置(不是下标)
int  search_data_seqlist(Seq_List*s,int i,ElementType *x);//返回指定位置的数据
void Display_seqlist(Seq_List*s);//对顺序表进行遍历
void sort_seqlist(Seq_List*s);//对顺序表进行排序
int value_length_seqlist(Seq_List*s);//计算顺序表的长度
void main()
{
    int i;
    int index;//要删除数据元素的位置
    int index2;//要插入的位置
    Seq_List*s;//顺序表指针
    int index3;//要返回数据位置的下标
    ElementType key;//要插入的数据
    ElementType str;//要查询的数据
        ElementType x;
    s=(Seq_List*)malloc(sizeof(Seq_List));  //对其进行初始化

    Init_seqlist(s);//对顺序表进行创建

        int result=create_seqlist(s);
        if(result==ERROR)
        {
            printf("顺序表创建失败:\n");
        }
        else
        {
            printf("顺序表创建成功:\n");
            printf("顺序表遍历的结果为:\n");
            Display_seqlist(s);
        }
        printf("\n");
        printf("顺序表的长度为%d\n",value_length_seqlist(s));
        printf("对顺序表中的元素排序的结果为:\n");
          sort_seqlist(s);
          for(i=0;i<s->last+1;i++)
            printf("[%s,%d]->",s->data[i].name,s->data[i].id);
             printf("\n");//换行
            printf("输入要删除的数据的位置:\n");
              scanf("%d",&index);
              int result1=delet_position(s,index);
              if(result1==ERROR)
                 printf("删除指定节点失败:\n");
                 else
                 {
                     printf("删除指点位置的节点成功:\n");
                     printf("删除之后数据的遍历结果为:\n");
                       Display_seqlist(s);
                       printf("\n");
                 }
                 printf("请输入要插入的节点的名称:\n");
                   key.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
                   key.id=rand()%50;//产生随机数字
                   scanf("%s",key.name);
                   printf("请输入要插入的位置:\n");
                     scanf("%d",&index2);
                    int result2=inset_seqlist(s,index2,key);
                    if(result2==ERROR)
                    {
                        printf("在指定位置插入数据失败:\n");
                    }
                    else
                        {
                            printf("在指定位置插入节点成功\n");
                            printf("插入数据之后的遍历的结果为\n");
                            Display_seqlist(s);
                            printf("\n");
                       }
                       printf("清输入要查找的数据:\n");
                       str.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
                       str.id=rand()%50;//产生随机数字
                       //对数据名称指针进行动态赋存储空间
                         scanf("%s",str.name);
                         int pos=search_seqlist(s,str);
                         if(pos==ERROR)
                         {
                             printf("查询数据失败:\n");
                         }
                         else{
                            printf("查询数据成功\n");
                            printf("要查询的数据在顺序表中的位置是%d\n",pos);
                         }
                         printf("请输入要返回数据位置:\n");
                            x.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
                            //进行动态分配存储空间 让其能存储字符串
                           scanf("%d",&index3);
                         int result3=search_data_seqlist(s,index3,&x);
                         if(result3==ERROR)
                         {
                             printf("该数据在顺序表中不存在:\n");

                         }
                         else
                             {

                                 printf("查找数据成功\n");
                                 printf("在顺序表位置为%d的数据为[%s,%d]",index3,x.name,x.id);
                             }

}
void Init_seqlist(Seq_List*s)
{
    s->data=(ElementType*)malloc(sizeof(ElementType)*MAXSIZE);
    //对顺序表的数组进行动态赋存储空间
    s->last=-1;//last的位置是数据元素在数组中的下标
}
Statu create_seqlist(Seq_List*s)//对顺序表进行创建
{
    int i=0;//数组的循环变量
    if(s==NULL)
    {
        return ERROR;//创建失败
    }

      char str[NAME_SIZE];
      printf("请输入数据的名称:\n");
        while(scanf("%s",str)!=EOF)
        {
            if(i+1==MAXSIZE)
                  break;//跳出while循环
            if(strcmp(str,"^")==0)
                   break;//跳出循环
            else
            {
                s->data[i].name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
                strcpy(s->data[i].name,str);
                s->data[i].id=rand()%50;//产生随机数据
                i++;
                s->last++;//将顺序表的指针进行自加

            }
        }
        return OK;
}
void  Display_seqlist(Seq_List*s)
{
    int i;
    if(s==NULL)
        printf("链表为空,遍历失败!\n");
        else
        {
            for(i=0;i<s->last+1;i++)
            {
                printf("[%s,%d]->",s->data[i].name,s->data[i].id);

            }
        }

}
int value_length_seqlist(Seq_List*s)//计算顺序表的长度
{
      return (s->last+1);//顺序表的长度为s->last的长度加一
}
void sort_seqlist(Seq_List*s)//对顺序表进行排序
{
    int i=s->last;//需要比较的次数
    int j;
    int flag=1;
    ElementType *t;
       t=(ElementType*)malloc(sizeof(ElementType));
      while(flag)
      {
          flag=0;//判断是否继续进行循环的操作
          for(j=0;j<i;j++)
          {
              if(s->data[j].id>s->data[j+1].id)
              {
                  //递增排序
                  *t=s->data[j];
                  s->data[j]=s->data[j+1];
                  s->data[j+1]=*t;//交换数据
                  flag=1;//循环继续进行标志
            }
         }
         i--;//循环次数减一
    }
}
int delet_position(Seq_List*s,int i)//在指定位置进行删除
{
    int j;//循环变量
   if(s->last==-1)
   {
       return ERROR;//顺序表为空  删除失败
   }
   else if(i<=0)
   {
       return ERROR;//删除位置违法
   }

    else
    {
       for(j=i-1;j<=s->last;j++)
            {
                s->data[j]=s->data[j+1];
            }
            s->last--;//顺序表的节点个数减一
           return OK;
    }
}
int inset_seqlist(Seq_List*s,int i,ElementType key)//在指定位置进行插入
{
    int j;//循环变量
    if(s->last+1>=MAXSIZE)
    {
        return ERROR;
    }
    else if(i<=0)
    {
        return ERROR;
    }
    else
    {
         for(j=s->last;j>=i-1;j--)
         {
             s->data[j+1]=s->data[j];
        }
        s->data[i-1]=key;
        s->last++;//last指针加一
        return OK;//插入成功
    }
}
int search_seqlist(Seq_List*s,ElementType key)//返回数据的位置(不是下标)
{
    int i;//循环变量
    for(i=0;i<s->last+1;i++)
    {
        if(strcmp(s->data[i].name,key.name)==0)
        {
            break;
        }
    }
    return (i==s->last+1 ? ERROR : i+1 );
}
int  search_data_seqlist(Seq_List*s,int i,ElementType *x)//返回指定位置的数据
{
    int j;
    //对数据的位置进行判断
    if(i<=0)//位置违法
          return ERROR;
    else if(s->last==-1)
          return ERROR;//顺序表为空
    else
    {
        x->id=s->data[i-1].id;
        strcpy(x->name,s->data[i-1].name);//对字符串进行赋值
        return OK;//返回数据成功
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值