C语言顺序表代码实现

顺序表:

顺序表的创建

定义结构体:结构体成员包含整形数组和一个记录最后一个数据下标的整形变量:

#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;
}

以上就是顺序表代码的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值