我的数据结构学习历程(C语言)
提示:该系列主要是通过C语言实现几种常用的数据结构
- 第一部分:线性表之顺序结构(顺序表),也就是数组
- 第二部分:线性表之单链表,也就是链表
- 第三部分:栈的实现
- 第四部分:队列的实现
本篇文章主要是对我对第一部分【线性表中的顺序表】的学习进行记录,主要是将自己写的代码保存下来,顺便将学习思路捋一下,把当时写代码的思路记录下来。
第一部分:线性表中的顺序表
简介:我们常把一种数据结构称为ADT(抽象数据类型)。
顺序表,顾名思义,就是在内存中是顺序存储的一种数据格式,在C语言中,数组就是一片连续的存储空间,所以顺序表的数据结构方式可以用数组来实现
基本操作:如何衡量构建好了一种ADT呢,也就是顺序表呢,该数据结构需要具有【增删改查】的基本属性,也就是说,我们需要把这种操作的接口给搭建起来。
提示:以下是本篇文章正文内容,下面案例可供参考
1.构建顺序表的基本格式
typedef int data_t;
#define N 128
typedef struct
{
data_t data[N];
int last;
}sqlist,*sqlink;
2.创建一个顺序表
sqlink list_create()
{
sqlink L = NULL;
L = (sqlink)malloc(sizeof(sqlist));
if(L == NULL)
{
printf("malloc failed\n");
}
return L;
}
3.清空顺序表(初始化)
代码如下(示例):
/*
* @ret -1:failed 0:success
* */
int list_clear(sqlink L)
{
if(L == NULL)
{
printf("invaild sqlist\n");
return -1;
}
memset(L,0,sizeof(sqlist));
L->last = -1;
return 0;
}
4.判断顺序表是否为空
/*
* @ret 0:empty 1:no empty
* */
int list_empty(sqlink L)
{
if(L == NULL)
{
printf("invaild sqlist\n");
return -1;
}
else
{
if(L->last == -1)
{
return 0;
}
else
{
return 1;
}
}
//return 0;
}
5 .判断某个元素是否在顺序表中,如果在,将对应的位置返回
int list_locate(sqlink L,data_t value)
{
if(L == NULL)
{
printf("invaild sqlist\n");
return -1;
}
for(int i = 0;i < L->last+1;i++)
{
if(L->data[i] == value)
{
return i;
}
}
return -1;
//return 0;
}
6 .在顺序表中任意有效位置插入一个元素
/*
* @ -1:failed 0:success
* */
int list_insert(sqlink L,data_t value,int pos)
{
if(L == NULL)
{
printf("invaild sqlist\n");
return -1;
}
if(pos < 0 || pos > L->last+1)
{
printf("invaild pos\n");
return -1;
}
for(int i = L->last;i >= pos;i--)
{
L->data[i+1] = L->data[i];
}
L->data[pos] = value;
L->last++;
return 0;
}
7 .在顺序表中任意有效位置删除一个元素
int list_delete(sqlink L,int pos)
{
if(L == NULL)
{
printf("invaild sqlist\n");
return -1;
}
if(pos <= 0 || pos > L->last+1)
{
printf("invaild pos\n");
return -1;
}
for(int i = pos;i<L->last+1;i++)
{
L->data[i] = L->data[i+1];
}
L->last--;
return 0;
}
8.(补充操作)取两个顺序表元素的并集
int list_merge(sqlink L1,sqlink L2)
{
if(L1 == NULL || L2 == NULL)
{
printf("invailed sqlist\n");
return -1;
}
int i = 0;
while(i <= L2->last)
{
int ret = list_locate(L1,L2->data[i]);
if(ret == -1)
{
list_insert(L1,L2->data[i],L1->last+1);
}
i++;
}
return 0;
}
9.(补充操作)删除顺序表中的重复元素
int list_purge(sqlink L)
{
if( L == NULL)
{
printf("invaild sqlist");
return -1;
}
int i = 1;
for(i = 1;i< L->last+1;i++)
{
int j = i - 1;
while(j >= 0)
{
//printf("************");
if(L->data[j] == L->data[i])
{
list_delete(L,i);
break;
}
else
{
j--;
}
}
if(j>=0)
{
i--;
}
}
return 0;
}
主函数main.c
#include "sqlist.h"
#include "stdio.h"
int main()
{
sqlink L = NULL;
sqlink L2 = NULL;
L = list_create();
L2 = list_create();
if(L == NULL && L2 ==NULL)
{
printf("list create failed\n");
}
list_clear(L);
list_clear(L2);
list_insert(L,1,L->last+1);
list_insert(L,2,L->last+1);
list_insert(L,3,L->last+1);
list_insert(L,4,L->last+1);
list_insert(L,4,L->last+1);
list_insert(L,1,L->last+1);
//=====================
list_insert(L2,5,L2->last+1);
list_insert(L2,6,L2->last+1);
list_insert(L2,7,L2->last+1);
list_insert(L2,8,L2->last+1);
for(int i = 0;i<L->last+1;i++)
{
printf("%d ",L->data[i]);
}
puts("");
for(int i = 0;i<L2->last+1;i++)
{
printf("%d ",L2->data[i]);
}
puts("");
list_purge(L);
for(int i = 0;i<L->last+1;i++)
{
printf("%d ",L->data[i]);
}
puts("");
list_merge(L,L2);
for(int i = 0;i<L->last+1;i++)
{
printf("%d ",L->data[i]);
}
puts("");
/*
printf("loc=%d\n",list_locate(L,3));
list_insert(L,100,2);
list_delete(L,1);
for(int i = 0;i<L->last+1;i++)
{
printf("%d ",L->data[i]);
}
puts("");*/
return 0;
}
总结
本文介绍了对顺序表中的常用操作,函数和结构体声明在sqlist.h
文件中,具体的函数实现在sqlist.c
文件中,函数调用,逻辑实现在main.c
文件中。
关于链表的实现和操作,请关注下篇文章。