静态顺序表用C实现的各种操作

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

分别实现顺序表在各个位置的增删查改。

seqlist.h文件

#ifndef __SEQLIST_H_
#define __SEQLIST_H_
#define SEQLIST_MAX_Length    1000
#define ELEMTYPE  char

typedef struct {
	ELEMTYPE  sqlist[SEQLIST_MAX_Length];
	size_t size;
}seqlist;

seqlist seq;

void INIT_Seq(seqlist *seq);
void END_PUSH_Seq(seqlist *seq,ELEMTYPE value);
void END_POP_Seq(seqlist *seq);
void FRONT_PUSH_Seq(seqlist *seq,ELEMTYPE value);
void FRONT_POP_Seq(seqlist *seq);
char GET_RANDOM_ADDRESS(seqlist *seq,size_t n);
void ALTER_RANDROM_ADDRESS(seqlist *seq,size_t x,ELEMTYPE value);
size_t FIND_RANDOM_NUBER(seqlist *seq,ELEMTYPE value);
void INSERT_RANDOM(seqlist *seq,size_t t,ELEMTYPE value);
void ERASE_POSITON_VALUE(seqlist *seq,size_t position);
void REMOVE_VALUE(seqlist *seq, ELEMTYPE to_delete);
void REMOVEALL_VALUR(seqlist *seq, ELEMTYPE to_delete);
void REMOVEALL1_VALUR(seqlist *seq, ELEMTYPE to_delete);
void REMOVEALL2_VALUR(seqlist *seq, ELEMTYPE to_delete);
size_t SEQSIZE(seqlist *seq);
int SEQISEmpty(seqlist* seq);
void show(seqlist *seq,ELEMTYPE* massage);

void swap(ELEMTYPE *x,ELEMTYPE *y);
void SeqBubbleSort(seqlist* seq);

int char_cmp(void *x,void *y);
void SeqBubbleSort2(seqlist* seq, int (*cmp)(SType , SType));

//test
void Test_END_PUSH_Seq();
void Test_END_POP_Seq();
void Test_FRONT_PUSH_Seq();
void Test_FRONT_POP_Seq();
void Test_ALTER_RANDROM_ADDRESS();
void Test_GET_RANDOM_ADDRESS();
void Test_FIND_RANDOM_NUBER();
void Test_INSERT_RANDOM();
void Test_ERASE_POSITON_VALUE();
void Test_REMOVE_VALUE();
void Test_REMOVEALL_VALUR();
void Test_SEQSIZE();
void Test_SeqBubbleSort();
#endif


seqlist.c文件

#include<stdio.h>
#include<assert.h>
#include"seqlist.h"
void show(seqlist *seq,ELEMTYPE*massage)
{
 size_t i = 0;
 assert(seq);
 printf("%s",massage);//__FUNCTION__
 for(i=0;i< seq->size;i++)
 {
  printf("%c ",seq->sqlist[i]);
 }
 printf("\n\n");
}
//初始化
void INIT_Seq(seqlist *seq)
{
 seq->size = 0;
 seq->sqlist[seq->size] = 0;
}
//尾插
void END_PUSH_Seq(seqlist *seq,ELEMTYPE value)
{
 
 assert(seq);
 if(seq->size>SEQLIST_MAX_Length)
 {
  printf("error\n");
  return;
 }
 seq->sqlist[seq->size] = value;
 seq->size++;
 //printf("%c ",seq->sqlist[seq->size]);
}
//尾删
void END_POP_Seq(seqlist *seq)
{
 size_t i = 0;
 assert(seq);
 if(seq->size <=0)
 {
  printf("顺序表为空。\n");
  return;
 }
 seq->size--;
}
//头插
void FRONT_PUSH_Seq(seqlist *seq,ELEMTYPE value)
{
 size_t i = 0;
 assert(seq);
 seq->size++;
 if(seq->size>SEQLIST_MAX_Length)
 {
  printf("error\n");
  return;
 }
 for(i=seq->size;i>0;i--)
 {
  seq->sqlist[i]=seq->sqlist[i-1];
 }
 seq->sqlist[0]=value;
}
//头删
void FRONT_POP_Seq(seqlist *seq)
{
 size_t i = 0;
 assert(seq);
 if(seq->size <=0)
 {
  printf("顺序表为空。\n");
  return;
 }
 seq->size--;
 for(i=0;i<seq->size;i++)
 {
  seq->sqlist[i]=seq->sqlist[i+1];
 }
}
//读任意位置的元素
char GET_RANDOM_ADDRESS(seqlist *seq,size_t n)
{
 assert(seq);
 if(n>=0 && n<=seq->size)
 {
  return seq->sqlist[n];
 }
 else
 {
  printf("输入错误\n");
 }
 return 0;
}
//修改任意位置的元素
void ALTER_RANDROM_ADDRESS(seqlist *seq,size_t x,ELEMTYPE value)
{
 assert(seq);
 if(x>=0 && x<=seq->size)
 {
  seq->sqlist[x] = value;
 }
 else
 {
  printf("输入错误\n");
  return;
 }
}
//查找指定位置的元素
size_t FIND_RANDOM_NUBER(seqlist *seq,ELEMTYPE value)
{
 size_t i = 0;
 assert(seq);
 for(i=0;i<seq->size;i++)
 {
  if(seq->sqlist[i]==value)
  {
   return i;
  }
 }
 printf("没有该元素\n");
 return (size_t)-1;
}
//在任意位置插入元素
void INSERT_RANDOM(seqlist *seq,size_t t,ELEMTYPE value)
{
 size_t i = 0;
 assert(seq);
 seq->size++;
 if(seq->size>SEQLIST_MAX_Length)
 {
  printf("error\n");
 }
 if(seq->size < t)
 {
  printf("输入错误,请重新输入。\n\n");
  return;
 }
 for(i=seq->size;i>t;i--)
 {
  seq->sqlist[i]=seq->sqlist[i-1];
 }
 seq->sqlist[t] = value;
}
//删除指定位置的元素
void ERASE_POSITON_VALUE(seqlist *seq,size_t position)
{
 size_t i = 0;
 assert(seq);
 if(seq->size<0)
 {
  printf("顺序表为空,无法删除\n");
  return;
 }
 if(seq->size <= position || position < 0)
 {
  printf("该位置不存在元素,请重新输入。\n\n");
  return;
 }
 
 for(i=position;i<seq->size;i++)
 {
  seq->sqlist[i]=seq->sqlist[i+1];
 }
 seq->size--;
}
//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 
void REMOVE_VALUE(seqlist *seq, ELEMTYPE to_delete)
{
 size_t i = 0;
 int flag = 1;
 assert(seq);
 for(i=0;i<seq->size;i++)
 {
  if(seq->sqlist[i] == to_delete)
  {
   ERASE_POSITON_VALUE(seq,i);
   flag = 0;
   return;
  }
 }
 if(flag == 1)
 {
  printf("该元素不存在\n");
  return;
 }
}
//删除顺序表中所有的指定的值
void REMOVEALL_VALUR(seqlist *seq, ELEMTYPE to_delete)
{
 size_t i = 0,j  = 0 ;
 int flag = 1;
 assert(seq);
 if(seq->size<0)
 {
  printf("顺序表为空,无法删除\n");
  return;
 }
 for(i=0;i<seq->size;i++)
 {
  if(seq->sqlist[i] == to_delete)
  {
   flag = 0;
   for(j=i;j<seq->size;j++) //判断被删除元素的下一个元素是不是也要被删除
   {
    ERASE_POSITON_VALUE(seq,j);
    if(seq->sqlist [j+1] != to_delete)
    {
     ERASE_POSITON_VALUE(seq,j);
     break;
    }
   }
  }
 }
 if(flag == 1)
 {
  printf("该元素不存在\n");
  return;
 }
}
void REMOVEALL1_VALUR(seqlist *seq, ELEMTYPE to_delete)
{
 size_t i = 0,j = 0,count = 0;
 assert(seq);
 if(seq->size<0)
 {
  printf("顺序表为空,无法删除\n");
  return;
 }
 for(i=0;i<seq->size;)
 {
  if(seq->sqlist [i] == to_delete)
  {
   count++;
   i++;
   continue;
  }
  else
  {
   seq->sqlist[j] = seq->sqlist [i];
   i++;
   j++;
  }
 }
 seq->size = seq->size-count;
}
void REMOVEALL2_VALUR(seqlist *seq, ELEMTYPE to_delete)
{
  size_t i = 0,j = 0,count = 0;
  assert(seq);
  if(seq->size <= 0)
  {
   printf("改顺序表为空。\n\n");
   return;
  }
  for(;i<seq->size ;i++)
  {
   if(seq->sqlist [i] == to_delete)
   {
    count++;
   }
   else
   {
    seq->sqlist [i-count] = seq->sqlist[i];
   }
  }
  seq->size -= count;
}
//求顺序表中元素的个数
size_t SEQSIZE(seqlist *seq)
{
 assert(seq);
 if(seq->size <0)
 {
  printf("该顺序表为空\n");
  return (size_t)-1;
 }
 return seq->size ;
}
//判定顺序表是否为空
int SEQISEmpty(seqlist* seq)
{
 assert(seq);
 if(seq->size <=0)
 {
  return 1;
 }
 else
  return 0;
}
//冒泡排序
void swap(ELEMTYPE *x,ELEMTYPE *y)
{
 ELEMTYPE temp = *x;
 //temp= *x;
 *x = *y;
 *y = temp;
}
void SeqBubbleSort(seqlist* seq)
{
 
 size_t i = 0,j = 0,flag = 1;
 assert(seq);
 for(i=0;i<seq->size-1;i++)
 {
  for(j=0;j<seq->size-i-1;j++)
  {
   if(seq->sqlist [j] > seq->sqlist [j+1])
   {
    flag = 0;
    swap(&seq->sqlist [j],&seq->sqlist [j+1]);
   }
  }
  if(flag ==1)
  {
   return ; 
  }
 }
}
int char_cmp(void *x,void *y)
{
 char *a = x;
 char *b = y;
 return a > b ? 1: a < b ? -1 : 0 ;
}
void SeqBubbleSort2(seqlist* seq, int (*cmp)(SType , SType))
{
 
 size_t i = 0,j = 0,flag = 1;
 assert(seq);
 for(i=0;i<seq->size-1;i++)
 {
  for(j = 0;j<seq->size-i-1;j++)
  {
   if(cmp ((char *)seq->sqlist [j],(char *)seq->sqlist [j+1])>0)
   {
    swap(&seq->sqlist [j],&seq->sqlist [j+1]);
    flag = 0;
   }
  }
  if(flag == 1)
  {
   return ; 
  }
 }
}


test.c文件

#include<stdio.h>
#include<assert.h>
#include"seqlist.h"
void Test_END_PUSH_Seq()
{
 printf("|||||||||||||||||||||||||||||||||||||||||尾插||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 END_PUSH_Seq(&seq,'a');
 END_PUSH_Seq(&seq,'b');
 END_PUSH_Seq(&seq,'c');
 END_PUSH_Seq(&seq,'d');
 END_PUSH_Seq(&seq,'e');
 show(&seq,"尾插");
}
void Test_END_POP_Seq()
{
 printf("|||||||||||||||||||||||||||||||||||||||||尾删||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 //END_POP_Seq(&seq);     //判断边界条件
 END_PUSH_Seq(&seq,'a');
 END_PUSH_Seq(&seq,'b');
 END_PUSH_Seq(&seq,'c');
 END_PUSH_Seq(&seq,'d');
 END_PUSH_Seq(&seq,'e');
 END_POP_Seq(&seq);
 show(&seq,"尾删"); 
}
void Test_FRONT_PUSH_Seq()
{
 printf("|||||||||||||||||||||||||||||||||||||||||头插||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 FRONT_PUSH_Seq(&seq,'e');
 show(&seq,"头插");
}
void Test_FRONT_POP_Seq()
{
 printf("|||||||||||||||||||||||||||||||||||||||||头删||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 //FRONT_POP_Seq(&seq);  //判断边界条件
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 FRONT_POP_Seq(&seq);
 show(&seq,"头删");
}
void Test_ALTER_RANDROM_ADDRESS()
{
 printf("|||||||||||||||||||||||||||||||||||||||||修改||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("\n请输入想要修改的位置的元素:");
 ALTER_RANDROM_ADDRESS(&seq,2,'p');
 show(&seq,"修改");
}
void Test_GET_RANDOM_ADDRESS()
{
 printf("|||||||||||||||||||||||||||||||||||||||||读取||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("请输入想要读取的位置:");
 printf("%c\n", GET_RANDOM_ADDRESS(&seq,1));
}
void Test_FIND_RANDOM_NUBER()
{
 printf("|||||||||||||||||||||||||||||||||||||||||下标||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("要查找的元素的下标为:");
 printf("%d", FIND_RANDOM_NUBER(&seq,'d'));
 printf("\n");
 //若返回为-1,则就是没有改元素
}
void Test_INSERT_RANDOM()
{
 printf("|||||||||||||||||||||||||||||||||||||||||插入||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("\n要插入的元素为:");
 INSERT_RANDOM(&seq,2,'k');
 show(&seq,"插入");
}
void Test_ERASE_POSITON_VALUE()
{
 printf("|||||||||||||||||||||||||||||||||||位置删除||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("删除指定位置的元素:");
 ERASE_POSITON_VALUE(&seq,3);
 show(&seq,"删除");
}
void Test_REMOVE_VALUE()
{
 printf("||||||||||||||||||||||||||||||元素删除||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 //REMOVE_VALUE(&seq, 'b');
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'d');
 show(&seq,"头插");
 //printf("删除指定元素:");
 REMOVE_VALUE(&seq, 'b');
 show(&seq,"元素删除");
}
void Test_REMOVEALL_VALUR()
{
 printf("||||||||||||||||||||||||||||||元素所有删除||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'d');
 FRONT_PUSH_Seq(&seq,'b');
 show(&seq,"头插");
 //printf("删除顺序表中所有的指定的值:");
 //REMOVEALL_VALUR(&seq, 'b');     //方法一
 //REMOVEALL1_VALUR(&seq, 'b');     //方法二
 REMOVEALL2_VALUR(&seq, 'b');     //方法三
 show(&seq,"元素所有删除");
}
void Test_SEQSIZE()
{
 printf("||||||||||||||||||||||||||||||元素个数||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'b');
 FRONT_PUSH_Seq(&seq,'c');
 FRONT_PUSH_Seq(&seq,'b');
 show(&seq,"头插");
 //printf("求元素的个数:");
 printf("%d\n",SEQSIZE(&seq));
}
void Test_SEQISEmpty()
{
 printf("||||||||||||||||||||||||||||||判空||||||||||||||||||||||||||||||||||||||||||\n");
 printf("判顺序表是否为空:");
 printf("%d\n",SEQISEmpty(&seq));
}
void Test_SeqBubbleSort()
{
 printf("||||||||||||||||||||||||||||||冒泡||||||||||||||||||||||||||||||||||||||||||\n");
 INIT_Seq(&seq);
 FRONT_PUSH_Seq(&seq,'a');
 FRONT_PUSH_Seq(&seq,'v');
 FRONT_PUSH_Seq(&seq,'g');
 FRONT_PUSH_Seq(&seq,'q');
 FRONT_PUSH_Seq(&seq,'d');
 FRONT_PUSH_Seq(&seq,'j');
 FRONT_PUSH_Seq(&seq,'l');
 show(&seq,"头插");
 //printf("将顺序表中的元素用冒泡法进行排序:");
 show(&seq,"排序前的结果为:");
 //SeqBubbleSort(&seq);
 SeqBubbleSort2(&seq, char_cmp);
 show(&seq,"排序后的结果为:");
}
int main()
{
 Test_END_PUSH_Seq();
 Test_END_POP_Seq();
 Test_FRONT_PUSH_Seq();
 Test_FRONT_POP_Seq();
 Test_ALTER_RANDROM_ADDRESS();
 Test_GET_RANDOM_ADDRESS();
 Test_FIND_RANDOM_NUBER();
 Test_INSERT_RANDOM();
 Test_ERASE_POSITON_VALUE();
 Test_REMOVE_VALUE();
 Test_REMOVEALL_VALUR();
 Test_SEQSIZE();
 Test_SeqBubbleSort();
 return 0;
}

 

运行结果:




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于C语言编写程序实现静态查找表的查找的问题。下面是代码实现: ```c #include <stdio.h> #define MAXSIZE 10 // 定义最大记录数 #define SUCCESS 1 // 定义成功返回值 #define UNSUCCESS 0 // 定义失败返回值 typedef struct { int key; // 关键字 char *other; // 其他数据域 } RecordType; typedef struct { RecordType r[MAXSIZE + 1]; // 存储顺序表,r[0]未用 int length; // 顺序表长度 } SqList; // 初始化 void InitList(SqList *L) { L->length = 0; } // 插入 int Insert(SqList *L, RecordType r) { if (L->length >= MAXSIZE) { return UNSUCCESS; } L->r[++L->length] = r; return SUCCESS; } // 顺序查找 int SeqSearch(SqList L, int key, int *count) { int i; for (i = 1; i <= L.length; i++) { (*count)++; if (L.r[i].key == key) { return i; } } return UNSUCCESS; } // 折半查找 int BinarySearch(SqList L, int key, int *count) { int low = 1, high = L.length, mid; while (low <= high) { (*count)++; mid = (low + high) / 2; if (L.r[mid].key == key) { return mid; } else if (L.r[mid].key > key) { high = mid - 1; } else { low = mid + 1; } } return UNSUCCESS; } int main() { SqList L; RecordType r; int i, key, pos, count_seq = 0, count_bin = 0; // 构造查找表 InitList(&L); printf("请输入%d个记录,每个记录包括关键字和其他数据,以空格分隔:\n", MAXSIZE); for (i = 1; i <= MAXSIZE; i++) { scanf("%d%s", &r.key, r.other); Insert(&L, r); } // 顺序查找 printf("\n请输入要查找的关键字:"); scanf("%d", &key); pos = SeqSearch(L, key, &count_seq); if (pos != UNSUCCESS) { printf("顺序查找成功,第%d个记录的关键字为%d,其他数据为%s\n", pos, L.r[pos].key, L.r[pos].other); printf("顺序查找比较次数:%d\n", count_seq); } else { printf("顺序查找失败,未找到关键字为%d的记录\n", key); printf("顺序查找比较次数:%d\n", count_seq); } // 折半查找 printf("\n请输入要查找的关键字:"); scanf("%d", &key); pos = BinarySearch(L, key, &count_bin); if (pos != UNSUCCESS) { printf("折半查找成功,第%d个记录的关键字为%d,其他数据为%s\n", pos, L.r[pos].key, L.r[pos].other); printf("折半查找比较次数:%d\n", count_bin); } else { printf("折半查找失败,未找到关键字为%d的记录\n", key); printf("折半查找比较次数:%d\n", count_bin); } return 0; } ``` 上述代码中,我们定义了一个结构体RecordType来存储每个记录,包含了关键字和其他数据域;另外定义了一个结构体SqList来存储顺序表,其中r[0]未用,length表示顺序表长度。InitList用于初始化;Insert用于插入记录。 顺序查找函数SeqSearch采用线性查找算法,从头到尾依次查找,直到找到关键字为止。折半查找函数BinarySearch采用二分查找算法,在有序表中查找关键字。 在main函数中,我们先构造一个查找表,然后让用户输入要查找的关键字,依次进行顺序查找和折半查找,并输出查找结果和比较次数。 运行程序,输入一组记录,如下所示: ``` 请输入10个记录,每个记录包括关键字和其他数据,以空格分隔: 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j ``` 然后输入要查找的关键字,比如输入5,输出如下: ``` 请输入要查找的关键字:5 顺序查找成功,第5个记录的关键字为5,其他数据为e 顺序查找比较次数:5 请输入要查找的关键字:5 折半查找成功,第5个记录的关键字为5,其他数据为e 折半查找比较次数:2 ``` 我们可以看到,顺序查找和折半查找都能找到关键字为5的记录,但折半查找的比较次数只有2次,效率明显更高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值