数据结构手把手教学——顺序表

一、线性表的特点

线性表
1、逻辑结构:①具有线性结构,有表头(没有前驱)、有表尾(没有后继)。②有且只有一个直接前驱和一个直接后继。
2、操作规则:任意位置插入和删除数据。

二、顺序表

1、顺序表和线性表的关系:顺序表是线性表的顺序存储结构
数据结构手把手教学——顺序表_第1张图片
last:

①非空:表示最后一块数据的下标。
②空:last = -1


三、用C语言实现顺序表

1、构造存储结构

#define SIZE 8
typedef int datatype;
typedef struct seqlist{
     
	datatype data[SIZE];
	int last;
}seq_list, *seq_plist;

2、初始化

初始化要完成的工作:①申请一块空间。②设置last = -1。

/* 初始化 */
void init_seqlist(seq_plist *list)
{
     
	*list = (seq_plist)malloc(sizeof(seq_list));	/* 申请内存空间 */
	if (NULL == *list)
	{
     
		printf("申请内存失败\n");
		perror("malloc");	/* 打印申请内存失败的原因*/
		exit(1);			/* 让当前程序结束 */
	}
	
	(*list)->last = -1;
}

3、插入数据

①确定插入的位置
②移动旧的数据
③插入新的数据
④last++;

(1)、如下图所示,在位置3后面插入一个新的数据,插入前last = 5。
数据结构手把手教学——顺序表_第2张图片
(2)、如下图所示,插入新数据后,last = 6。
数据结构手把手教学——顺序表_第3张图片

/* 插入数据
   list:顺序表
   i:新数据插入的位置
   data:插入的新数据
 */
void insert_seqlist(seq_plist list, int i, datatype data)
{
     
    int j = 0;

    /* 从位置i开始将顺序表的数据往后移动 */
    for (j = list->last; j >= i; j--)
    {
     
        list->data[j+1] = list->data[j];
    }

    list->data[i] = data; /* 将data插入到i的位置 */
    list->last++;   /* 因为last表示最后一个数据的下标,因此需要将last加1*/
}

4、删除数据

①确定要删除数据的位置。
②移动数据
③last–

如下图所示,删除数据前last为5。
数据结构手把手教学——顺序表_第4张图片
如下图所示,删除数据后last为4。
数据结构手把手教学——顺序表_第5张图片

/* 删除数据
   list:顺序表
   i:删除数据的位置
 */
void delete_seqlist(seq_plist list, int i)
{
     
    int j = 0;

    /* 将位置i后面的数据全部往前面移动一个位置 */
    for (j = i; j < list->last; j++)
    {
     
        list->data[j] = list->data[j+1];
    }

    list->last--; /* 因为last表示最后一个数据的下标,因此需要让last减去1 */
}

5、判断顺序表是否为空

判断数据是否为空,只需判断last是否为-1。

/* 判断顺序表是否为空
   list:顺序表
 */
void isempty_seqlist(seq_plist list)
{
     
    if (-1 == list->last)
    {
     
        return true;
    }
    else
    {
     
        return false;
    }
}

6、判断顺序表是否已经满

判断顺序表是否已经满,只需判断last是否为SIZE - 1。

/* 判断顺序表是否已满
   list:顺序表
 */
bool isfull_seqlist(seq_plist list)
{
     
    if ((SIZE - 1) == list->last)
    {
     
        return true;
    }
    else
    {
     
        return false;
    }
}

四、练习题

用顺序表存储一些整数,要求如下:
①输入正整数表示插入数据(比如输入3表示插入3)。
②输入负数表示删除数据(比如输入-2表示删除2)。
③输入字符表示退出程序。
④插入和删除数据的过程中保持该顺序表数据有序递增。

1、将数据插入顺序表,且保持数据有序递增

/* 将数据插入顺序表,且保持有序递增
    list:顺序表
    idata:要插入的数据
 */
void insert_data(seq_plist list, datatype idata)
{
     
      int i = 0;
      if(isfull_seqlist(list))
      {
     
          printf("顺序表已满!\n");
          return;
      }

      /* 然顺序表有序递增插入 */
      for(i = 0; i <= list->last; i++)
      {
     
          if(idata < list->data[i])
          {
     
              break;
          }
      }
	    
      insert_seqlist(list, i, idata);
}

2、将数据从顺序表删除,且保持数据有序递

/* 将数据从顺序表删除,且保持有序递增
    list:顺序表
    ddata:要删除的数据
 */
void delelet_data(seq_plist list, datatype ddata)
{
     
      int i = 0;

      if(isempty_seqlist(list))
      {
     
          printf("顺序表为空!\n");
          return ; 
      }

      for(i = 0; i <= list->last; i++)
      {
     
          if(ddata == list->data[i])
          {
     
              break;
          }
      }

      if(i > list->last)
      {
     
          printf("%d 不在顺序表中!\n", ddata);
          return ;
      }
      delete_seqlist(list, i);
}

3、遍历打印顺序表

/* 遍历打印顺序表
   list:顺序表
*/
void show_seqlist(seq_plist list)
{
     
    int i = 0;

    for (i = 0; i <= list->last; i++)
    {
     
        printf("%d\t", list->data[i]);
    }
}

4、主函数

int main(void)
{
     
    seq_plist list;
    datatype data;
    int ret = 0;

    init_seqlist(&list);  /* 初始化顺序表 */

    while(1)
    {
     
	    printf("请输入一个除0之外的整数:");
	    ret = scanf("%d", &data);    /* 输入int型返回1,否则返回0 */

	    if(ret == 0)    /* 输入为字符,退出while循环,程序结束 */
        {
                    
             printf("Bye-bye!\n"); 
             break;
	    }
        else
        {
     
            if(data > 0)   /* 输入为正整数,插入数据并打印新的顺序表 */
            {
       
                insert_data(list, data);
                show_seqlist(list);
            }
            else if(data < 0)   /* 输入为负整数,删除数据并打印新的顺序表 */
            {
     	
                delelet_data(list, -data);
                show_seqlist(list);
            }
            else
            {
     
                /* code */
            }
        }
    }

    return 0;
}

5、实验结果

(1)、输入正整数时,增加数据且数据有序递增:
数据结构手把手教学——顺序表_第6张图片
(2)、当超过8个数据时会提示顺序表已满:
数据结构手把手教学——顺序表_第7张图片

(3)、输入负整数时,删除数据,且数据有序递增:
数据结构手把手教学——顺序表_第8张图片
(4)、如果删除数据不在顺序表中,则提示该数据不在顺序表中:
数据结构手把手教学——顺序表_第9张图片

(5)、当数据删除完之后,再删除数据会提示顺序表为空:
数据结构手把手教学——顺序表_第10张图片

五、完整代码

https://github.com/sanjaywu/DataStructure

你可能感兴趣的:(数据结构与算法,顺序表)