欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-22 19:55:34
...

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

#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;//返回数据成功
    }
}