专题二-可复用顺序线性表

正在看国嵌唐老师数据结构,留着记录

//main.c文件
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	SeqList* list = SeqList_Create(5);
	
	int i = 0;
	int j = 1;
	int k = 2;
	int x = 3;
	int y = 4;
	int z = 5;
	int index = 0;
	
	SeqList_Insert(list, &i, 0);
	SeqList_Insert(list, &j, 0);
	SeqList_Insert(list, &k, 0);
	SeqList_Insert(list, &x, 0);
	SeqList_Insert(list, &y, 0);
	SeqList_Insert(list, &z, 0);
	
	printf("length = %d\n", SeqList_Length(list));
	printf("\n--------------------------------\n");
	
	//遍历顺序表 
	for (index=0; index<SeqList_Length(list); index++) {
		
		int* p = (int*)SeqList_Get(list, index);	//取元素
		
		printf("%d\n", *p);
	}
	
	printf("\n--------------------------------\n");
	
	//反转顺序表 
	SeqList_Reverse(list);
	
	//遍历顺序表 
	for (index=0; index<SeqList_Length(list); index++) {
		
		int* p = (int*)SeqList_Get(list, index);	//取元素
		
		printf("%d\n", *p);
	}
	
	printf("\n--------------------------------\n");
		
	//删除元素 
	while (SeqList_Length(list) > 0) {
		int* p = (int*)SeqList_Delete(list, 0);
		
		printf("%d\n", *p);
	}
	
	//销毁顺序表 
	SeqList_Destroy(list);	
	
	return 0;
}


//SeqList.c文件
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"

typedef unsigned int TSeqListNode;	//数据元素类型 存放的是 各种数据的地址 所以才用unsigned int 

typedef struct _tag_SeqList {
	int capacity;	//容量 
	int length;	//长度
	TSeqListNode* node; 
} TSeqList;

/*创建顺序表*/
SeqList* SeqList_Create(int capacity)
{
	TSeqList* ret = NULL;
	
	if (capacity >= 0 ) {
		ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);
	}
	
	if (ret != NULL) {
		ret->capacity = capacity;		//容量
		ret->length = 0;			//长度
		ret->node = (TSeqListNode*)(ret + 1);	//结点   指针运算
	}
	
	return ret;
}

/*销毁顺序表*/
void SeqList_Destroy(SeqList* list)
{
	free(list);
}

/*清空顺序表*/
void SeqList_Clear(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;
	
	if (sList != NULL) {
		sList->length = 0;
	}	
}

/*返回长度*/
int SeqList_Length(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;
	int ret = -1;
	
	if (sList != NULL) {
		ret = sList->length;
	}
	
	return ret;			
}

/*返回容量*/
int SeqList_Capacity(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;
	int ret = -1;
	
	if (sList != NULL) {
		ret = sList->capacity;
	}
	
	return ret;	
}

/*插入元素*/
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
	TSeqList* sList = (TSeqList*)list;
	int ret = (sList != NULL);	//是否有效 
	int i = 0;	
	
	//是否有位置可插入 
	ret = ret && (sList->length + 1 <= sList->capacity); 
	ret = ret && (0 <= pos);
	
	if (ret) {
		//如果大于等于长度,调整pos值 
		if (pos >= sList->length) {
			pos = sList->length;
		}
		
		//开始移动元素 向后退 
		for (i=sList->length; i>pos; i--) {
			sList->node[i] = sList->node[i-1];
		}
		
		//存放元素 
		sList->node[i] = (TSeqListNode)node; 
		
		sList->length++;
	}
	
	return ret;
}

/*反转元素*/
int SeqList_Reverse(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;
	int ret = (sList != NULL);	//是否有效 
	int i = 0;
	int j = sList->length - 1;
	SeqListNode* tmp = NULL;
	
	//开始反转
	if (ret) {
		for (i=0; i<j; i++, j--) {
			tmp = (SeqListNode*)sList->node[i];
			sList->node[i] = sList->node[j];
			sList->node[j] = (unsigned int)tmp;
		}
	}
	
	return ret;
}

/*获取元素*/ 
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
	TSeqList* sList = (TSeqList*)list;
	SeqListNode* ret = NULL;
	
	//获取元素 
	if ((sList != NULL) && (0 <= pos) && (pos <= sList->length)) {
		ret = (SeqListNode*)(sList->node[pos]);
	}
	
	return ret;		
}

/*删除元素*/
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
	TSeqList* sList = (TSeqList*)list; 
	SeqListNode* ret = SeqList_Get(list, pos);	//保存删除的元素
	int i = 0;
	
	//开始向前移动元素 
	if (ret != NULL) {
		for (i=pos+1; i<sList->length; i++) {
			sList->node[i-1] = sList->node[i];
		}
		
		sList->length--;			
	}
	
	return ret;	
}


//SeqList.h文件
#ifndef _SEQLIST_H_
#define _SEQLIST_H_

//声明void 类型 数据封装 避免误操作 
typedef void SeqList;	
typedef void SeqListNode;

SeqList* SeqList_Create(int capacity);

void SeqList_Destroy(SeqList* list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

int SeqList_Reverse(SeqList* list);

SeqListNode* SeqList_Get(SeqList* list, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值