关闭

静态和动态顺序表的实现(c语言)

599人阅读 评论(0) 收藏 举报
分类:

 

(一)静态顺序表的实现

 

SeqList.h文件

 
#pragma once

#define MAX_SIZE 1000

typedef int DataType;

typedef unsigned int size_t;

typedef struct SeqList

{
 DataType array[MAX_SIZE];

 size_t size;

}SeqList;

 
void InitSeqList(SeqList* pSeq);

void PushBack(SeqList* pSeq, DataType x);

void PopBack(SeqList* pSeq);

void PushFront(SeqList* pSeq, DataType x);

void PopFront(SeqList* pSeq);

void Insert(SeqList* pSeq, size_t pos, DataType x);

int Find(SeqList* pSeq, DataType x);

void Erase(SeqList* pSeq, size_t x);

int Remove(SeqList* pSeq, DataType x);

int RemoveAll(SeqList* pSeq, DataType x);

void BubbleSort(SeqList* pSeq);

void SelectSort(SeqList* pSeq);

int BinarySearch(SeqList* pSeq, DataType x);

void PrintSeqList(SeqList* pSeq);

SeqList.c文件

#include "SeqList.h"

#include <stdio.h>

#include <string.h>

#include <assert.h>

void InitSeqList(SeqList* pSeq)

{

 memset(pSeq->array, 0, sizeof(DataType) * MAX_SIZE);

 pSeq->size = 0;

}

//

//1.检查参数

//2.检查边界条件

//3.实现函数功能

//

void PushBack(SeqList* pSeq,DataType x)

{

 assert(pSeq);

 if(pSeq ->size >= MAX_SIZE)

 {

  printf("SeqList is fulled\n");

  return;

 }

 else

 {

  pSeq ->array[pSeq -> size++] = x;

 }

}

void PopBack(SeqList* pSeq)

{

 assert(pSeq);

 if(pSeq ->size == 0)

 {

  printf("SeqList is Empty\n");

  return;

 }

 else

 {

  pSeq -> array[pSeq -> size] = 0;

  pSeq -> size --;

 }

}

void PushFront(SeqList* pSeq, DataType x)

{

 size_t i = pSeq ->size;

 assert(pSeq);

 while(i > 0)

 {

  pSeq -> array[i] = pSeq->array[i - 1];

  i--;

 }

 pSeq ->array[0] = x;

 pSeq ->size++;

}

void PopFront(SeqList* pSeq)

{

 size_t i = 1;

 assert(pSeq);

 while(i <= pSeq->size - 1)

 {

  pSeq -> array[i - 1] = pSeq->array[i];

  i++;

 }

 pSeq ->array[pSeq->size - 1] = 0;

 pSeq ->size--;

}

void Insert(SeqList* pSeq, size_t pos, DataType x)

{

 int i = (int)pSeq ->size - 1;

 assert(pSeq);

 assert(pos >= 0 && pos <= pSeq->size);

 while(pos <= i && i >= 0) //i >= 0;解决问题 :0位置插入

 {

  pSeq ->array[i + 1] = pSeq ->array[i];

  i--;

 }

 pSeq ->array[pos] = x;

 pSeq ->size++;

}

int Find(SeqList* pSeq, DataType x)

{

 int i = pSeq->size - 1;

 assert(pSeq);

 while(i >= 0)

 {

  if(pSeq->array[i] == x)

  {

   return i;

  }

  i--;

 }

 return -1;

}

void Erase(SeqList* pSeq, size_t x) //将第几个数删除 0始 

{

 int i = x;

 assert(pSeq);

 assert(x >= 0 && x < pSeq->size);

 while(i < pSeq->size - 1)

 {

  pSeq->array[i] = pSeq->array[i + 1];

  i++;

 }

 pSeq->size--;

}

int Remove(SeqList* pSeq, DataType x)

{

 int i = 0;

 assert(pSeq);

 while(i < pSeq->size)

 {

  if(pSeq->array[i] == x)

  {

   Erase(pSeq, i);

   return i;

  }

  i++;

 }

 return -1;

}

int RemoveAll(SeqList* pSeq, DataType x)

{

 int count = 0;

 int i = 0;

 while(i < pSeq->size)

 {

  if(pSeq->array[i] == x)

  {

   count++;

  }

  else

  {

   pSeq->array[i - count] = pSeq->array[i];

  }

  i++;

 }

 pSeq->size -= count;

 return count;

}

void BubbleSort(SeqList* pSeq)

{

 int i = 0;

 int j = 0;

 assert(pSeq);

 for(i = 0;i < pSeq->size - 1; i++)

  for(j = 0; j < pSeq->size - 1 - i; j++)

  {

   if(pSeq->array[j] > pSeq->array[j + 1])

   {

    int tmp = pSeq->array[j + 1];

    pSeq->array[j + 1] = pSeq->array[j];

    pSeq->array[j] = tmp;

   }

  }

}

void SelectSort(SeqList* pSeq)//一次选出最大最小的数据分别放在序列两边

{

 int left = 0;

 int right = pSeq->size - 1;

}

int BinarySearch(SeqList* pSeq, DataType x)

{

 int left = 0;

 int right = pSeq->size - 1;

 assert(pSeq);

 while(left <= right)

 {

  int mid = left + (right - left) / 2;

  if(x < pSeq->array[mid])

  {

   right = mid - 1;

  }

  else if(x > pSeq->array[mid])

  {

   left = mid + 1;

  }

  else

   return mid;

  mid = left + (right - left) / 2;

 }

 return -1;

}


void PrintSeqList(SeqList* pSeq)

{

 int i = 0;

 assert(pSeq);

 while(i < pSeq ->size)

 {

  printf("%d -> ",pSeq -> array[i]);

  i++;

 }

}

text.c文件 

#include "SeqList.h"
#include <stdio.h>
#include <stdlib.h>
void test1()
{
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 PopBack(&seq);
 PopBack(&seq);
 PopBack(&seq);
 PopBack(&seq);
 PopBack(&seq);
 PrintSeqList(&seq);
}
void test2()
{
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 PushFront(&seq, 1);
 PopFront(&seq);
 PrintSeqList(&seq);
}
void test3()
{
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
PushBack(&seq, 3);
 PushBack(&seq, 4);
 //Insert(&seq,0,5);
 Insert(&seq,4,5);
 PrintSeqList(&seq);
}
void test4()
{
 int ret;
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 
 ret = Find(&seq, 4);
 if(ret >= 0)
 {
  printf("pos:%d\n", ret);
 }
 else
 {
  printf("No Exit!\n");
 }
}
void test5()
{
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 //Erase(&seq, 0);
 Erase(&seq, 3);
 PrintSeqList(&seq);
}
void test6()
{
 int ret;
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 //ret = Remove(&seq, 3);
 ret = Remove(&seq, 5);
 if(ret < 0)
 {
  printf("No Exit!\n");
 }
 PrintSeqList(&seq);
}
void test7()
{
 int ret;
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 2);
 PushBack(&seq, 4);
 PushBack(&seq, 2);
 ret = RemoveAll(&seq, 2);
 //ret = RemoveAll(&seq, 5);
 if(ret == 0)
 {
  printf("No Exit!\n");
 }
 PrintSeqList(&seq);
}
void test8()
{
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 7);
 PushBack(&seq, 2);
 PushBack(&seq, 6);
 PushBack(&seq, 3);
 PushBack(&seq, 5);
 PushBack(&seq, 4);
 PushBack(&seq, 1);
 BubbleSort(&seq);
 PrintSeqList(&seq);
}
void test9()
{
 int ret = 0;
 SeqList seq;
 InitSeqList(&seq);
 PushBack(&seq, 1);
 PushBack(&seq, 2);
 PushBack(&seq, 3);
 PushBack(&seq, 4);
 PushBack(&seq, 5);
 PushBack(&seq, 6);
 PushBack(&seq, 7);
 //ret = BinarySearch(&seq, 1);
 //ret = BinarySearch(&seq, 8);
 //ret = BinarySearch(&seq, 4);
 ret = BinarySearch(&seq, 5);
 if(ret < 0)
  printf("No Exit!\n");
 else
  printf("%d\n", ret);
 PrintSeqList(&seq);
}
int main()
{
 //test1();
 //test2();
 //test3();
 //test4();
 //test5();
 //test6();
 //test7();
 //test8();
 test9();
 system("pause");
 return 0;
}

 (二)动态顺序表的实现(简略:只有部分主要功能)

SeqList_D.h文件

#pragma once
typedef int DataType;
typedef unsigned size_t;
typedef struct SeqList_D
{
 DataType* array;          
//指向数据块的指针
 size_t size;              //当前数据数
 size_t capacity;          
//总容量
}SeqList_D;
void InitSeqList_D(SeqList_D* pseq_d);
int IsFullCapacity(SeqList_D* pseq_d);
int IsEmptyCapacity(SeqList_D* pseq_d);
void PushBack(SeqList_D* pseq_d,DataType data);
void PopBack(SeqList_D* pseq_d);
void PrintSeq(SeqList_D* pseq_d);
 
 
SeqList_D.c
#include "SeqList_D.h"
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
void InitSeqList_D(SeqList_D* pseq_d)
{
 assert(pseq_d);
 pseq_d->array = (DataType*)malloc(sizeof(DataType) * 3);
 pseq_d->size = 0;
 pseq_d->capacity = 3;
}
void PushBack(SeqList_D* pseq_d,DataType data)
{
 assert(pseq_d);
 if(IsFullCapacity(pseq_d))//full
 {
  pseq_d->capacity = pseq_d->capacity * 2 + 3;
  pseq_d->array = (DataType*)realloc(pseq_d->array, sizeof(DataType) * pseq_d->capacity);
 }
 pseq_d->array[pseq_d->size++] = data;
}
int IsFullCapacity(SeqList_D* pseq_d)
{
 if(pseq_d->size >= pseq_d->capacity)
 {
  return 1;   //full
 }
 else
 {
  return 0;  
 }
}
int IsEmptyCapacity(SeqList_D* pseq_d)
{
 if(pseq_d->size <= 0)
 {
  return 1;   //empty
 }
 else
  return 0;
}
void PopBack(SeqList_D* pseq_d)
{
 if(IsEmptyCapacity)
 {
  printf("SeqList is Eempty");
  return;
 }
 else
 {
  pseq_d->size--;
 }
}
void PrintSeq(SeqList_D* pseq_d)
{
 int i = 0;
 for(;i < pseq_d->size; i++)
 {
  printf("%d->", pseq_d->array[i]);
 }
}

test.c 文件

 

#include <stdio.h>
#include <stdlib.h>
#include "SeqList_D.h"
void text1()
{
 SeqList_D s1;
 InitSeqList_D(&s1);
 PushBack(&s1, 1);
 PushBack(&s1, 2);
 PushBack(&s1, 3);
 PushBack(&s1, 4);
 PushBack(&s1, 5);
 PrintSeq(&s1);
}
int main()
{
 text1();
 system("pause");
 return 0;

 

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27994次
    • 积分:600
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    文章分类
    最新评论