数据结构day3(顺序表)

 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

以下是顺序表增删改查及冒泡排序

 head.h

#ifndef __A_H__
#define __A_H__

#include <stdio.h>
#include <stdlib.h>

typedef int datedef;

#define MAX 10
typedef struct // 创建顺序表结构
{
  datedef date[MAX];

  int len;
} Seqlist, *seqlist;

typedef struct // 创建顺序表结构
{
  datedef date[MAX * 2];

  int len;
} Seqlist1, *seqlist1;

seqlist creat(); // 创建顺序表

seqlist1 creat1(); // 创建顺序表

int pE(seqlist list); // 判空
int pM(seqlist list); // 判满

int pE1(seqlist1 list); // 判空

int insert(seqlist list, int q); // 尾插

int output(seqlist list);   // 输出
int output1(seqlist1 list); // 输出

int del(seqlist list);                      // 尾删
int search(seqlist list, int n);            // 查找
int update(seqlist list, int w, datedef e); // 修改

int mid_s(seqlist list, int n, datedef e); // 中间插入(前置)
int mid_del(seqlist list, int n);          // 中间删除

int p_search(seqlist list, datedef e);            // 位置查找
int p_del(seqlist list, datedef e);               // 元素删除
int p_update(seqlist list, datedef a, datedef e); // 元素修改
int p_dd(seqlist list);                           // 元素去重

int p_insert(seqlist list, datedef a, datedef e); // 某元素后插入
int bubble(seqlist list);                         // 排序

void toget(seqlist a, seqlist b, seqlist1 c); // 有序表排序

typedef int datedef;

#endif

fun.c

#include "head.h"
seqlist creat() // 创建顺序表
{
  seqlist list = (seqlist)malloc(sizeof(Seqlist));
  if (list == NULL)
    return NULL;
  list->len = 0;
  return list;
}

seqlist1 creat1() // 创建顺序表
{
  seqlist1 list1 = (seqlist1)malloc(sizeof(Seqlist1));
  if (list1 == NULL)
    return NULL;
  list1->len = 0;
  return list1;
}

int pE(seqlist list) // 判空
{
  return list->len == 0 ? -1 : 0;
}

int pE1(seqlist1 list) // 判空
{
  return list->len == 0 ? -1 : 0;
}

int pM(seqlist list) // 判满
{
  return list->len >= MAX ? -1 : 0;
}

int insert(seqlist list, int q) // 尾插
{
  if (list == NULL || pM(list))
  {
    printf("创建失败!\n");
    return -1;
  }

  list->date[list->len] = q;
  list->len++;
}

int output(seqlist list) // 输出
{
  if (list == NULL || pE(list))
  {
    printf("输出失败!\n");
    return -1;
  }
  for (int i = 0; i < list->len; i++)
  {
    printf("date[%d]=%d\t", i + 1, list->date[i]);
  }
  puts("");
}

int output1(seqlist1 list) // 输出
{
  if (list == NULL || pE1(list))
  {
    printf("输出失败!\n");
    return -1;
  }
  for (int i = 0; i < list->len; i++)
  {
    printf("c[%d]=%d\t", i + 1, list->date[i]);
  }
  puts("");
}

int del(seqlist list) // 尾删
{
  if (list == NULL || pE(list))
    return -1;
  list->len--;
}

int search(seqlist list, int n) // 查找
{
  if (list == NULL || pE(list) || n < 1 || n > list->len)
  {
    printf("查找失败!\n");
    return -1;
  }
  printf("查找到元素为:%d\n", list->date[n - 1]);
}

int update(seqlist list, int n, datedef e) // 修改
{
  if (list == NULL || pE(list) || n < 1 || n > list->len)
  {
    printf("操作失败!\n");
    return -1;
  }
  list->date[n - 1] = e;
}

int mid_s(seqlist list, int n, datedef e) // 中间插入
{
  if (list == NULL || pM(list) || n < 1 || n > list->len + 1)
  {
    printf("操作失败!\n");
    return -1;
  }
  for (int i = list->len; i > n - 1; i--)
  {
    list->date[i] = list->date[i - 1];
  }
  list->date[n - 1] = e;
  list->len++;
}

int mid_del(seqlist list, int n) // 中间删除
{
  if (list == NULL || pE(list) || n < 1 || n > list->len + 1)
  {
    printf("操作失败!\n");
    return -1;
  }
  for (int i = n - 1; i < list->len; i++)
  {
    list->date[i] = list->date[i + 1];
  }
  list->len--;
  return 0;
}

int p_search(seqlist list, datedef e) // 位置查找
{
  if (list == NULL || pE(list))
  {
    printf("顺序表不存在。\n");
    return -1;
  }
  int b = 0;
  for (int i = 0; i < list->len; i++)
  {
    if (list->date[i] == e)
    {
      b = i + 1;
      return b;
      break;
    }
  }
  if (b > list->len)
    return -1;
}

int p_del(seqlist list, datedef e) // 元素删除
{
  int n = p_search(list, e);
  mid_del(list, n);
  printf("操作完成\n");
  return 0;
}

int p_update(seqlist list, datedef a, datedef e) // 元素修改
{
  int n = p_search(list, a);
  update(list, n, e); // 修改
  printf("操作完成\n");
  return 0;
}

int p_dd(seqlist list) // 元素去重
{
  if (list == NULL || pE(list))
  {
    printf("操作失败\n");
    return -1;
  }
  for (int i = 0; i < list->len - 1; i++)
  {
    for (int j = i + 1; j < list->len; j++)
    {
      if (list->date[i] == list->date[j])
      {

        mid_del(list, j + 1); // 中间删除
        j--;
      }
    }
  }
  printf("操作完成\n");
  return 0;
}

int p_insert(seqlist list, datedef a, datedef e) // 某元素后插入
{
  int n = p_search(list, a);
  if (n == -1)
  {
    printf("没有该元素\n");
    return -1;
  }
  mid_s(list, n + 1, e); // 中间插入
  printf("操作完成\n");
  return 0;
}

int bubble(seqlist list) // 排序
{
  if (list == NULL || pE(list))
  {
    printf("操作失败\n");
    return -1;
  }
  for (int i = 1; i < list->len; i++)
  {
    int count = 0;
    for (int j = 0; j < list->len - i; j++)
    {
      if (list->date[j + 1] < list->date[j])
      {
        datedef k = list->date[j];
        list->date[j] = list->date[j + 1];
        list->date[j + 1] = k;
        count++;
      }
    }
    if (count == 0)
      break;
  }
  printf("操作完成\n");
  return 0;
}

void toget(seqlist a, seqlist b, seqlist1 c) // 有序表排序
{

  int i = 0, j = 0;
  while (i < a->len && j < b->len && !pE(a) && !pE(b))
  {
    if (a->date[i] <= b->date[j])
    {
      c->date[c->len] = a->date[i];
      i++;
      c->len++;
    }
    else if (a->date[i] > b->date[j])
    {
      c->date[c->len] = b->date[j];
      j++;
      c->len++;
    }
  }
  while (i < a->len || j < b->len)
  {
    if (j < b->len)
    {
      c->date[c->len] = b->date[j];
      j++;
      c->len++;
    }
    else if (i < a->len)
    {
      c->date[c->len] = a->date[i];
      i++;
      c->len++;
    }
  }
}

main.c

#include "head.h"

int main()
{

  seqlist list = creat();

  int n;
  datedef e;
  printf("输入元素个数:");
  scanf("%d", &n);
  if (n > MAX)
    n = MAX;
  for (int i = 0; i < n; i++)
  {
    printf("要输入的元素是:");
    scanf("%d", &e);
    insert(list, e);
  }

  output(list);
  /*
  del(list);
  output(list);

  printf("你要查找的元素是第几个?");
  scanf("%d",&n);
  search(list,n);

  printf("你要修改的元素是第几个?");
  scanf("%d",&n);
  printf("你要将该元素改为:");
  scanf("%d",&e);
  update(list,n,e);
  output(list);

  printf("你要在第几个位置插入?");
  scanf("%d",&n);
  printf("你要将该元素改为:");
  scanf("%d",&e);
  mid_s(list,n,e);   //中间插入(前置)
  output(list);

  printf("你要删除的元素是第几个?");
  scanf("%d",&n);
  mid_del(list,n);   //中间删除
  output(list);


  printf("你要查找的元素为:");
  scanf("%d",&e);
  n=p_search(list,e);   //位置查找
  if(!n)
  {
  printf("该元素不存在\n");
  }
  else if(n!=-1)
  {
    printf("该元素在第%d个。\n",n);
  }
  */

  /*
  printf("你要删除的元素为:");
  scanf("%d",&e);
  p_del(list,e);   //元素删除
  output(list);
  */
  /*
  datedef a;
  printf("你要修改的元素为:");
  scanf("%d",&a);
  printf("你要将该元素改为:");
  scanf("%d",&e);
  p_update(list,a,e);   //元素修改
  output(list);


  p_dd(list);        //元素去重
  output(list);
  */

  datedef a;
  printf("你要插入的前一个元素为:");
  scanf("%d", &a);
  printf("你要插入的元素为:");
  scanf("%d", &e);
  p_insert(list, a, e); // 元素前插入
  output(list);

  bubble(list); // 排序
  output(list);

  seqlist list1 = creat();

  printf("输入元素个数:");
  scanf("%d", &n);
  if (n > MAX)
    n = MAX;
  for (int i = 0; i < n; i++)
  {
    printf("要输入的元素是:");
    scanf("%d", &e);
    insert(list1, e);
  }

  bubble(list1); // 排序
  output(list1);

  seqlist1 c = creat1();
  toget(list, list1, c);

  output1(c);

  free(list);
  list = NULL;
  free(list1);
  list1 = NULL;
  free(c);
  c = NULL;

  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值