数据结构静态顺序表

顺序表:用一段地址连续存储单元依次存储数据元素的线性结构

//seqlist.h
#pragma once//防止头文件重复包含
#define MAX_SIZE 10
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

实现基于静态数组的顺序表的以下基本操作: 
首先先定义一个结构体类型seqlist( arr【】,size(有效的元素个数)),

预定义一个数组的最大长度,将整型数据变量typedef为datatype,为了以后在插入删除别的类型时方便修改

  1. 初始化 void InitSeq(seqlist *s) 
    将数组的size置为0,不需要给每个元素进行赋值,
  2. 尾插 void SeqListPushBack(seqlist *s,int data) 
    首先要判断是否为空数组,并且是否有空余位置插入,将数组的size+1,把元素放入最后一个位置。
  3. 尾删void SeqListPophBack(seqlist *s) 
    只需将size-1即可,也得先判断是否为空数组
  4. 头插 void SeqListPushFront(seqlist *s, int data) 
    首先要判断是否为空数组,并且是否有空余位置插入。把数组整体向后移一位(先移动最后一个元素),将第0号元素空出来,把需要插入的元素放入即可,size++。
  5. 头删 void SeqListPopFront(seqlist *s) 
    判断是否为空数组,若不是,把后边的元素整体向前移(先移动第一个元素),size--。
  6. 查找任意位置元素 void SeqListFind(seqlist *s, int pos) 
    判断是否为空数组,直接输出给定位置的元素还得判断给的位置是否超出数组最大范围
  7. 修改任意位置元素void UpdateData(seqlist *s, int pos, int data) 
    判断是否为空数组还得判断给的位置是否超出数组最大范围, 先找到这个位置元素,将其值进行修改,
  8. 查找指定元素值的下标void SeqListFind(seqlist *s, int data) 
    判断是否为空数组还得判断给的位置是否超出数组最大范围,给定一个元素,遍历,判断是否与数组内的元素相等,若不相等,count++,
  9. 在任意位置插入元素void SeqListInsert(seqlist *s, int pos,int data) 
    首先要判断是否为空数组,并且是否有空余位置插入还得判断给的位置是否超出数组最大范围,将(下标+1)的元素依次向后移动,再将给定元素插入给定位置,size+1; 
    10.在任意位置删除元素 void SeqListDelete(seqlist *s,int  pos)
    要判断是否为空数组,将给定位置的下一个元素向前覆盖,依次到最后一个元素,size-1。

#include"seqlist.h"
typedef int DataType;
typedef struct SeqList
{
	int arr[MAX_SIZE];  // 最大元素个数
	int size;        //有效元素个数
}seqlist;

以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。

各种函数主体:

void InitSeq(seqlist *s)//初始化静态线性表
{
  assert(s);
  if(s == NULL)
  {
       return;
  }
   s->size = 0;
}
void SeqListPrint(seqlist *s)//打印整个数组
{
   size_t i = 0;
   assert(s); 
   for(;i < s->size;i++)    
   {
   printf("%d",s->arr[i]);
   }
   printf("\n");
}

void SeqListPopBack(seqlist *s)//尾删
{
   assert(s);
   if(s == NULL)
   {
   return;
   }
   s->size--;
}

void SeqListPushBack(seqlist *s,DataType data)//尾部插入
{
  assert(s);
  if(s == NULL)
  {
  return ;
  }
  if(s->size > MAX_SIZE)
  {
   return;
  }
   s->arr[s->size] = data;//size为有效元素个数,从0开始,相当于最后一个为空元素,所以可以直接赋值
   s->size++;             //指向size下一个空元素
}
 
void SeqListPushFront(seqlist *s,int data)//头插
{
	int i = 0;
	assert(s);
	if(s == NULL)
	{
	 return;
	}
	if(s->size>MAX_SIZE)
	{
	return;
	}
	++s->size;   
	for(i = s->size;i>0;i--)
	{
		s->arr[i] = s->arr[i - 1];
	}
	s->arr[0] = data;
}
void SeqListPopFront(seqlist *s)//头删
{   int i = 0;
    assert(s);
    if (s == NULL)
    {
        return;
    }
    for ( i = 1; i <= s->size; i++)
    {
        s->arr[i - 1] = s->arr[i];
    }
    s->size--;
}

int  SeqListFind(seqlist *s,int data)//查找指定元素
{
   int i = 0;
   assert(s);
   if(s == NULL)
   {
   return -1;
   }
   for(i=0;i<s->size;i++)
   {
	   if(s->arr[i] == data)
	   {
	   return i;
	   }
   }
   return -2;
}

void SeqListInsert(seqlist *s,int pos,int data)//任意(pos)位置插入
{
       int i = 0;
	   if((s == NULL)||!((pos <= s->size) && pos >= 0))
	   {
		   printf("数据越界");
	   return ;
	   }
	   if(10 == s->size )
	   {
	   printf("表以满");
	   }
	   s->size++;
	   for(i = s->size;i>pos;i--)
	   {
		   s->arr[i] = s->arr[i - 1];
	   }
	   s->arr[pos] = data;
}

void SeqListDelete(seqlist *s,int pos)//删除下标为pos的元素
{
   int i = 0;
   assert(s);
   if(s ==NULL)
   {
   return;
   }
   for(i = pos;i<s->size;i++)
   {
	   s->arr[i] = s->arr[i + 1];
   }
   s->size--;

}

void SeqListRemoveall(seqlist *s,int data)//删除所有data元素
{  
   int i = 0;
   int count = 0;
   assert(s);
   for(i=0;i<s->size;i++)
   {
	   if(s->arr[i] == data)
	   {
	   count++;
	   }
	   else
	   {
		   s->arr[i - count] = s->arr[i];//发现几个data向前移动几个
	   }
	   s->size -= count;
   }
}

int BinarySearch(seqlist *s,int data)
{
   int left = 0;
   int right = s->size;
   while(left<right)
   {
	   int mid = left + ((right - left) >> 1);
	   if(data == s->arr[data])
	   {
	   return mid;
	   }
	   else if(data>mid)
	   {
	   left = mid + 1;
	   }
	   else
	   {
	   right = mid ;
	   }
   }
   return 0;
}

测试部分:

void test()
{
   seqlist s;
   int tmp;
   InitSeq(&s);
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   SeqListPushBack(&s,3);
   SeqListPushBack(&s,4);
   printf("初始化,尾插后的数组: \n");
   SeqListPrint(&s);

   printf("/////////////\n");
   SeqListPopBack(&s);
   printf("尾删后的数组:\n");
   SeqListPrint(&s);

   printf("/////////////\n");
   SeqListPushFront(&s,0);
   printf("头插后的数组:\n");
   SeqListPrint(&s);

   printf("/////////////\n");
   SeqListPopFront(&s);
   printf("头删后的数组: \n");
   SeqListPrint(&s);

   printf("////////////\n");
   tmp = SeqListFind(&s,2);
   printf("arr[1]的元素位置为:%d\n",tmp);

   printf("////////////\n");
   SeqListInsert(&s,0,9);
   printf("任意位置插入后的数组: \n");
   SeqListPrint(&s);

   printf("////////////\n");
   SeqListDelete(&s,0);
   printf("删除位置为0元素的数组: \n");
   SeqListPrint(&s);

   printf("////////////\n");
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   printf("删除前数前:");
   SeqListPrint(&s);
   SeqListRemoveall(&s,2);
   printf("删除所有data元素后:  \n");
   SeqListPrint(&s);
}
主函数:

int main()
{
   test();
   system("pause");
   return 0;
}




猜你喜欢

转载自blog.csdn.net/w_j_f_/article/details/79874870