数据结构线性表―静态顺序表的实现

本文主要实现静态顺序表基本功能:初始化、插入(头插、尾插、任意位置插入)、删除(头删、尾删、任意位置删除,删除指定元素、删除所有指定元素)、排序(冒泡排序)、逆序、查找(二分查找)

 

//静态顺序表结构

#define MAX 100    //顺序表能存储的最大数目的元素个数

typedef int DataType;
typedef  struct SeqList
{
 DataType list[MAX]; //顺序表
 int size;           //存储数量
}SeqList,*pSeqList;

 

主要功能接口如下:

void InitSeqList(pSeqList pseq);//初始化顺序表 

void PrintSeqList(SeqList seq);//打印顺序表内容 

void PushBack(pSeqList pseq, DataType x);//尾部插入元素 

void PopBack(pSeqList pseq);//尾部删除元素 

void PushFront(pSeqList pseq, DataType x);//头插 

void PopFront(pSeqList pseq);//头删 

void Insert(pSeqList pseq,int pos,DataType x);//插入元素 

void Remove(pSeqList pseq, DataType x);//删除指定元素 

void RemoveAll(pSeqList pseq, DataType x);//删除顺序表中所有的指定元素 

int Find(SeqList Seq, int pos, DataType x);//按位置开始查找元素 

void ReverseList(pSeqList Seq);//顺序表逆序 

void SortSeqList(pSeqList pseq);//顺序表排序 

int BinarySearch(pSeqList pseq,DataType x);//二分查找

函数的实现:

 void InitSeqList(pSeqList pseq)
{
      memset(pseq->list, 0, sizeof(pseq->list));
      pseq->size = 0;
}
void PrintSeqList(SeqList seq)
{
     int i = 0;
     for (i = 0; i < seq.size; i++)
     {
      printf("%d ", seq.list[i]);
     }
}
void PushBack(pSeqList pseq, DataType x)
{
     if (pseq->size == MAX)
     {
      printf("顺序表已满\n");
     }
     else
     {
      pseq->list[pseq->size] = x;
      pseq->size++;
     }
}
void PopBack(pSeqList pseq)
{
     if (pseq->size == 0)
     {
      printf("顺序表为空\n");
     }
     else
     {
      pseq->size--;
     }
}
void PushFront(pSeqList pseq, DataType x)
{
     int i = 0;
     if (pseq->size == MAX)
     {
      printf("顺序表已满\n");
     }
     else
     {
      for (i = pseq->size; i > 0; i--)
      {
           pseq->list[i] = pseq->list[i - 1];
      }
      pseq->list[0] = x;
      pseq->size++;
     }
}
void PopFront(pSeqList pseq)
{
     int i = 0;
     if (pseq->size == 0)
     {
      printf("顺序表为空\n");
     }
     else
     {
      for (i = 0; i < pseq->size; i++)
      {
       pseq->list[i] = pseq->list[i + 1];
      }
      pseq->size--;
     }
}
void Insert(pSeqList pseq, int pos, DataType x)
{
     int i = 0;
     if (pseq->size == MAX)
     {
      printf("顺序表已满\n");
     }
     else
     {
      for (i = pseq->size; i > pos; i--)
      {
       pseq->list[i] = pseq->list[i - 1];
      }
      pseq->list[pos] = x;
      pseq->size++;
     }
}
int Find(SeqList Seq,int pos, DataType x)
{
     int i = 0;
     for (i = pos; i < Seq.size; i++)
     {
      if (Seq.list[i] == x)
      {
       return i;
      }
     }
     return -1;
}
void Remove(pSeqList pseq, DataType x)
  {
      int i = 0;
     int pos = Find(*pseq,0, x);
     if (pos!=-1)
     {
      for (i = pos; i < pseq->size; i++)
      {
       pseq->list[i] = pseq->list[i + 1];
      }
      pseq->size--;
     }
     else
      printf("not exit\n");
}
void RemoveAll(pSeqList pseq, DataType x)
{
     int pos = 0;
     int i = 0;
     pos = Find(*pseq, pos, x);
     if (pos == -1)
     {
      printf("not exit\n");
      return;
     }
     while (pos!=-1)
     {
      for (i = pos; i < pseq->size; i++)
      {
       pseq->list[i] = pseq->list[i + 1];
      }
      pseq->size--;
      pos = Find(*pseq, pos, x);
     }
}
void ReverseList(pSeqList pSeq)
{
     int start = 0;
     int end = pSeq->size - 1;
     int tmp = 0;
     while (start < end)
     {
      tmp = pSeq->list[start];
      pSeq->list[start] = pSeq->list[end];
      pSeq->list[end] = tmp;
      start++;
      end--;
     }
}
void SortSeqList(pSeqList pseq)
{
     int i = 0;
     int j = 0;
     int tmp = 0;
     int flag = 0;
     for (i = 0; i < pseq->size; i++)
     {
      flag = 0;
      for (j = 0; j < pseq->size-i-1; j++)
      {
   
       if (pseq->list[j] > pseq->list[j+1])
       {
        tmp = pseq->list[j];
        pseq->list[j] = pseq->list[j+1];
        pseq->list[j + 1] = tmp;
        flag = 1;
       }
      }
      if (flag == 0)
      {
       break;
      }
     }
}
int BinarySearch(pSeqList pseq, DataType x)
{
     int left = 0;
     int right = pseq->size - 1;
     while (left <= right)
     {
          int mid = left - ((left - right) >>1);
          if (pseq->list[mid] > x)
      {
       right = mid-1;
      }
      else if (pseq->list[mid] < x)
      {
       left = mid + 1;
      }
      else
       return mid;
     }
     return -1;
}

 

你可能感兴趣的:(线性表,功能,静态顺序表)