数据结构:使用顺序表完成头插,尾删,打印,查找,排序,删除等操作。

顺序表实现一对一的关系,只有找到前面一个才能按顺序找下一个。

顺序表的代码实现:

seqlist.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "seqlist.h"
//创建顺序表,返回指向顺序表的指针
seq seqlist_create()
{
//动态申请内存
   seq P=(seq)malloc(sizeof(seqlist));
   if (P==NULL)
  {
   printf("申请内存失败\n");
   return NULL;
  }
  else
 {
   printf("内存申请成功\n");
   P->len=0; //让顺序表的长度为0
   //memset实现的是,单个字节置位
   memset(P->data,0,sizeof(P->data));
   return P;
 }
}
//插入,尾插
void insert_seqlist(seq P,int data)
{
   //防止段错误
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(full_seqlist(P))
  {
   printf("表已满,不能插入\n");
  }
   else
  {
   //赋值
   P->data[P->len]=data;
   //长度+1
   P->len++;
  }
}
//打印顺序表
void print_seqlist(seq P)
{
   int i=0;
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(empty_seqlist(P))
  {
   printf("表为空,无需打印\n");
  }
   while(i<P->len)
  {
   printf("P->data[%d]=%d\n",i,P->data[i]);
   i++;
  }
}
//判空
int empty_seqlist(seq P)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   //条件运算符a>b?1:0,如果a>b成立返回1,不成立返回0
   return P->len==0?1:0;
}
//判满
int full_seqlist(seq P)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   return P->len==MAX?1:0;
}
/*//顺序表的按位置插入,只能插入从1开始的位置,pos表示是第几个元素
void insert_pos_seq(seq P,int data,int pos)
{
   int i;
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(pos<1||pos>P->len+1)
  {
   printf("位置不合理,不能插入\n");
  }
   else
  {
      for(i=P->len;i>=pos;i--)
    {
      P->data[i]=P->data[i-1];
    }
      P->data[pos-1]=data;
      P->len++;
  }
}*/
//可以实现第0个位置插入的,pos表示的是元素下标
void insert_pos_seq(seq P,int data,int pos)
{
   int i;
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(pos<0||pos>P->len)
  {
   printf("位置不合理,不能插入\n");
  }
   else
  {
     for(i=P->len-1;i>=pos;i--)
    {
     P->data[i+1]=P->data[i];
    }
     P->data[pos]=data;
     P->len++;
  }
}
//尾删
void dele_seqlist(seq P)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(empty_seqlist(P))
  {
   printf("表为空,无需删除\n");
  }
   else
  {
   P->len--;
  }
}
//按位置删除,pos表示下标,从0开始
void dele_pos(seq P,int pos)
{
   int i;
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
   return;
  }
   if(pos<0||pos>P->len)
  {
   printf("位置不合理\n");
   return;
  }
     for(i=pos;i<P->len;i++)
    {
     P->data[i]=P->data[i+1];
    } 
     P->len--;
}
//按值查找,返回位置
int search_data(seq P,int data)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(empty_seqlist(P))
  {
   printf("顺序表为空\n");
  }
   else
  {
     for (int i=0;i<P->len;i++)
    {
       if(P->data[i]==data)
     {
        return i;
     }
    }
  }
     printf("查找不成功\n");
     return -1;
}
//按位置修改元素
void update_seq(seq P,int data,int pos)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(pos<0||pos>=P->len)
  {
   printf("位置不合理\n");
  }
   else
  {
   P->data[pos]=data;
  }
}
//顺序表选择排序
void sort_seq(seq P)
{
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   int i,j,index,temp;
   //控制排序次数
     for(i=1;i<P->len;i++)
    {
     //每次排序都更新,假定最小值的下标
     index=i-1;
      for(j=i-1;j<P->len;j++)
     {
         if(P->data[index]>P->data[j])
       {
         index=j; //找到更小值,更新下标
       }
     }
     if(index!=i-1)
    {
     //每次找到的最小值,跟待排序列中的第一个元素交换
     temp = P->data[index];
     P->data[index]=P->data[i-1];
     P->data[i-1]=temp;
    }
  }
}
//按位置查找
int search_pos(seq P,int pos)
{
   int i;
   if(P==NULL)
  {
   printf("入参为空,请检查\n");
  }
   else if(pos<0||pos>=P->len)
  {
   printf("位置不合理\n");
  }
   else
  {
     for(i=0;i<P->len;i++)
    {
       if(pos==i)
      {
       printf("元素存在");
       return P->data[i];
      }
    }
  }
}

seqlist.h


#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct
{
int data[MAX];
int len;
}seqlist,*seq;
//typedef int a ;//把数据类型int重定义为a
//typedef int* p ; //把int*数据类型,重定义为p
//创建顺序表,返回指向顺序表的指针
seq seqlist_create();
//插入,头插
void insert_seqlist(seq P,int data);
//打印顺序表
void print_seqlist(seq P);
//判空
int empty_seqlist(seq P);
//判满
int full_seqlist(seq P);
//顺序表的按位置插入
void insert_pos_seq(seq P,int data,int pos);
//尾删
void dele_seqlist(seq P);
//按值查找,返回位置
int search_data(seq P,int data);
//按位置删除,pos表示下标
void dele_pos(seq P,int pos);
//顺序表选择排序
void sort_seq(seq P);
//按位置修改元素
void update_seq(seq P,int data,int pos);
//按位置查找
int search_pos(seq P,int pos);
#endif

main.c

#include <stdio.h>
#include "seqlist.h"
int main(int argc, const char *argv[])
{
seq P=seqlist_create();
insert_seqlist(P,12);
insert_seqlist(P,2);
insert_seqlist(P,80);
insert_pos_seq(P,100,2);
insert_pos_seq(P,10,4);
insert_pos_seq(P,90,0);
dele_pos(P,3);
sort_seq(P);
print_seqlist(P);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值