顺序表:
顺序表的创建:
定义结构体:结构体成员包含整形数组和一个记录最后一个数据下标的整形变量:
#define DATASIZE 5
typedef struct
{
int data[DATASIZE];
int last;
}sqlist_t;
编写创建顺序表的函数:返回创建顺序表的首地址
sqlist_t *sqlist_create(void)
{
sqlist_t *list = NULL;
list = malloc(sizeof(sqlist_t));
if(list == NULL)
return NULL;
list->last = -1;
return list;
}
编写销毁顺序表的函数:参数:顺序表首地址
void sqlist_destroy(sqlist_t *list)
{
free(list);
}
顺序表的增删改查:
编写数据顺序表判满函数:用于添加时判断是否顺序表数据满了,返回值:满了返回真,没有则返回假,参数:顺序表首地址
int sqlist_isfull(sqlist_t *list)
{
if(list->last + 1 == DATASIZE)
return 1;
return 0;
}
编写数据增加函数:包括追加数据,插入数据
插入数据函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,data:要插入的数据,index:插入的下标位置。
int sqlist_insert(sqlist_t *list,int data,int index)
{
int i;
if(sqlist_isfull(list))
return -1;
if(index < 0 || index > list->last + 1)
return -2;
for(i = list->last+1;i > index; i--)
{
list->data[i] = list->data[i-1];//插入数据,数据后移
}
list->data[index] = data;
list->last++;
return 0;
}
追加数据函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,data:需要追加的数据。
追加是直接在顺序表末尾增加,可以直接编写在末尾增加的代码,也可以调用插入函数进行二次封装,在末尾追加
int sqlist_append(sqlist_t *list,int data)
{
return sqlist_insert(list,data,list->last+1);
/*
if(sqlist_isfull(list))
return -1;
list->last ++
list->data[list->last] = data;
return 0;
*/
}
编写数据遍历函数:可以遍历所有数据
遍历所有数据函数:参数:list:顺序表首地址。
void sqlist_display(sqlist_t *list)
{
int i;
for(i = 0; i <= list->last ; i++)
{
printf("%d\n",list->data[i]);
}
}
编写数据删除函数:可以根据对应下标删除,也可以根据对应数据删除。
根据下标删除的函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,index:要删除的数据下标。
int sqlist_delete(sqlist_t *list,int index)
{
int i;
if(index < 0 || index > list->last)
return -1;
for(i = index ; i < list->last; i++)
{
list->data[i] = list->data[i+1];//删除数据,数据前移
}
list->last--;
return 0;
}
根据数据查找返回对应下标函数:返回值:成功返回数据的对应下标,失败返回-1,参数:list:顺续表首地址,data:要查找的数据
int sqlist_find(sqlist_t *list,int data)
{
int i,j;
for(i = 0,j = list->last; i <= j; i++,j--)//双向遍历
{
if(list->data[i] == data)
return i;
if(list->data[j] == data)
return j;
}
/*
for(i = 0; i <= list->last ; i++)//单向遍历
{
if(list->data[i] == data)
return i;
}
*/
return -1;
}
根据数据删除的函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,data:要删除的数据。
int sqlist_delete_data(sqlist_t *list,int data)
{
int index;
index = sqlist_find(list,data);
if(index < 0)
return -1;
return sqlist_delete(list,index);
}
编写修改数据函数:根据对应下标或者对应数据的修改数据。
根据下标修改数据函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,index:要修改数据的下标,newData:新数据。
int sqlist_update(sqlist_t *list,int index,int newData)
{
int i;
if(index < 0 || index > list->last)
return -1;
list->data[index] = newData;
return 0;
}
根据原数据修改新数据函数:返回值:成功返回0,失败返回非0,参数:list:顺序表首地址,oldData:原数据,newData:新数据。
int sqlist_update_data(sqlist_t *list,int oldData,int newData)
{
int index;
index = sqlist_find(list,oldData);
return sqlist_update(list,index,newData);
}
完整代码:
sqlist.c
#include <stdlib.h>
#include <stdio.h>
#include "sqlist.h"
sqlist_t *sqlist_create(void)
{
sqlist_t *list = NULL;
list = malloc(sizeof(sqlist_t));
if(list == NULL)
return NULL;
list->last = -1;
return list;
}
int sqlist_append(sqlist_t *list,int data)
{
return sqlist_insert(list,data,list->last+1);
/*
if(sqlist_isfull(list))
return -1;
list->last ++;
list->data[list->last] = data;
return 0;
*/
}
int sqlist_isfull(sqlist_t *list)
{
if(list->last + 1 == DATASIZE)
return 1;
return 0;
}
int sqlist_insert(sqlist_t *list,int data,int index)
{
int i;
if(sqlist_isfull(list))
return -1;
if(index < 0 || index > list->last + 1)
return -2;
for(i = list->last+1;i > index; i--)
{
list->data[i] = list->data[i-1];
}
list->data[index] = data;
list->last++;
return 0;
}
void sqlist_display(sqlist_t *list)
{
int i;
for(i = 0; i <= list->last ; i++)
{
printf("%d\n",list->data[i]);
}
}
void sqlist_destroy(sqlist_t *list)
{
free(list);
}
int sqlist_find(sqlist_t *list,int data)
{
int i,j;
for(i = 0,j = list->last; i <= j; i++,j--)
{
if(list->data[i] == data)
return i;
if(list->data[j] == data)
return j;
}
/*
for(i = 0; i <= list->last ; i++)
{
if(list->data[i] == data)
return i;
}
*/
return -1;
}
int sqlist_delete(sqlist_t *list,int index)
{
int i;
if(index < 0 || index > list->last)
return -1;
for(i = index ; i < list->last; i++)
{
list->data[i] = list->data[i+1];
}
list->last --;
return 0;
}
int sqlist_delete_data(sqlist_t *list,int data)
{
int index;
index = sqlist_find(list,data);
if(index < 0)
return -1;
return sqlist_delete(list,index);
}
int sqlist_update(sqlist_t *list,int index,int newData)
{
int i;
if(index < 0 || index > list->last)
return -1;
list->data[index] = newData;
return 0;
}
int sqlist_update_data(sqlist_t *list,int oldData,int newData)
{
int index;
index = sqlist_find(list,oldData);
return sqlist_update(list,index,newData);
}
sqlist.h
#ifndef SQLIST_H__
#define SQLIST_H__
#define DATASIZE 5
typedef struct
{
int data[DATASIZE];
int last;
}sqlist_t;
sqlist_t *sqlist_create(void);
int sqlist_append(sqlist_t *list,int data);
int sqlist_insert(sqlist_t *list,int data,int index);
void sqlist_display(sqlist_t *list);
void sqlist_destroy(sqlist_t *list);
int sqlist_isfull(sqlist_t *list);
int sqlist_find(sqlist_t *list,int data);
int sqlist_delete(sqlist_t *list,int index);
int sqlist_delete_data(sqlist_t *list,int data);
int sqlist_update(sqlist_t *list,int index,int newData);
int sqlist_update_data(sqlist_t *list,int oldData,int newData);
#endif
main.c
#include <stdio.h>
#include "sqlist.h"
int main(void)
{
sqlist_t *list = NULL;
int index;
//sqlist_t *list2 = NULL;
//list2 = sqlist_create();
list = sqlist_create();
if(list == NULL){
printf("sqlist create is failed!\n");
return -1;
}
sqlist_append(list,10);
sqlist_append(list,20);
sqlist_append(list,30);
sqlist_insert(list,40,3);
sqlist_display(list);
printf("--------------\n");
//index = sqlist_find(list,40);
//index = sqlist_find(list,20);
//sqlist_delete(list,index);
sqlist_delete_data(list,20);
sqlist_display(list);
sqlist_destroy(list);
/*
printf("%d\n",sqlist_append(list,60));
sqlist_display(list);
sqlist_append(list2,100);
sqlist_append(list2,200);
sqlist_append(list2,300);
sqlist_display(list2);
sqlist_destroy(list);
sqlist_destroy(list2);
*/
return 0;
}
以上就是顺序表代码的实现。