顺序表的C、C++实现

一个线性表表实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数.

1.文件 line_list.h

//  line_list.h
#ifndef __LINE_LIST_H__
#define __LINE_LIST_H__


typedef int EleType;

typedef struct {
	EleType* pData;	//定义成指针,可以存放任意类型
	unsigned int num;
	unsigned int maxlength;   //线性表最大长度
	
}List;

List* CreateList(const int );	//创建线性表
void DestoryList(List*);	//删除线性表
void ClearList(List*);	//清空线性表
int ListAppend(List*, EleType);	 // 追加元素
int IsEmpty(List *);	//判空
int IsFull(List *);		//判满
int ListDelete(List *,unsigned int);	//删除元素
int GetElement(List *,unsigned int,EleType *);	// 取元素
int ListInsert(List *,unsigned int ,EleType );   //插入元素
int TraverseList(List *,int (*)(EleType * ));  //遍历线性表

#endif
  1. 文件 line_list.c
// line_list.c

#include <stdio.h>
#include <stdlib.h>
#include "line_list.h"


//创建线性表, maxlength为线性表最大长度
List* CreateList(const int maxlength)
{
	List* ls = (List*)malloc(sizeof(List));
	if(NULL != ls)
	{
		ls->pData = (EleType*)malloc((maxlength )*sizeof(EleType));
		if(NULL != ls->pData)
		{
			ls->maxlength = maxlength;
			ls->num = 0;
			return ls;
		}
	}
	printf("out of place.\n");
	return NULL;
}

//删除线性表
void DestoryList(List* ls)
{
	free(ls->pData);
	free(ls);
}

	//清空线性表
void ClearList(List* ls)
{
	ls->num = 0;
}



//判空,,线性表为空返回 1 ,否则返回 0
int IsEmpty(List* ls)
{
	return (0 == ls->num);
}


//判满,线性表已满返回 1 ,否则返回 0
int IsFull(List* ls)
{
	return (ls->num == ls->maxlength);
}


// 在末尾追加元素,成功返回1,失败返回0
int ListAppend(List* ls, EleType ele)
{
	if(!IsFull(ls))
	{
		ls->pData[ls->num++] = ele;	//注意这里
		return 1;
	}
	return 0;
}

//删除元素,删除编号为 n 的元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int ListDelete(List* ls, unsigned int n)
{
	if (!IsEmpty(ls))
	{
		if (n<1 || n>ls->num)
		{
			printf("n输入错误");
			return 0;
		}

		for( ;n<ls->num;n++ )
		{
			ls->pData[n-1] = ls->pData[n];			
		}
		ls->num--;
		return 1;
	}
	return 0;
}


// 取元素编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int GetElement(List* ls,unsigned int n, EleType * ele)
{
	if(!IsEmpty(ls))
	{
		if(n<1 || n>ls->maxlength)
		{
			printf("n输入错误");
			return 0;
		}
		*ele = ls->pData[n-1];
		return 1;
	}
	return 0;
}

 //插入元素,在位置 n 插入元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int ListInsert(List* ls,unsigned int n, EleType ele)
{
	unsigned int i=0;
	if(!IsFull(ls))
	{
		if(n<1 || n>ls->num)
		{
			printf("n输入错误");
			return 0;
		}

		for(i=ls->num; i>=n;i--)
		{
			ls->pData[i] = ls->pData[i-1];			
		}

		ls->pData[n-1] = ele;
		ls->num++;
		return 1;
	}
	return 0;
}

//遍历线性表,遍历线性表,并对元素进行操作,遍历完成返回 -1,否则返回当前元素编号。
int TraverseList(List* ls, int (*f)(EleType* ))
{
	unsigned int i=0;
	if (!IsEmpty(ls))
	{
		for (i=0;i<ls->num;i++)
		{
			if(!f(&ls->pData[i]))
				return i+1;
		}
		return 0;
	}
	return -1;
}

  1. 文件 main.c
// main.c


#include <stdio.h>
#include "line_list.h"

void ShowList(List*);	//显示线性表
int PrintElement(EleType* );	//输出元素

int main()
{
	int i;
	EleType ele;

	//创建线性表
	List* ls = CreateList(100);		
	if (NULL == ls)
	{
		printf("创建线性表失败\n");
		return 0;
	}
	
	//测试判空函数
	i =IsEmpty(ls);		
	if(i)
	{
		printf("线性表为空\n");
	}



	for (i=0;i<100;i++)
	{
		ListAppend(ls,i+1);
	}
	ShowList(ls);

	//测试判满函数
	i =IsFull(ls);
	if(i)
	{
		printf("线性表已满\n");
	}

	//测试取元素
	GetElement(ls,3,&ele);
	printf(" ele = %d\n",ele);

	//测试插入
	ListInsert(ls,5,23);
	ShowList(ls);
	ListInsert(ls,1,23);
	ShowList(ls);
	
	//测试删除
	ListDelete(ls,1);
	ShowList(ls);

	ListDelete(ls,5);
	ShowList(ls);
    
	return 1;
}


//显示线性表
void ShowList(List* ls)
{
	TraverseList(ls,PrintElement);
	printf("\n");
}

//输出元素
int PrintElement(EleType* ele)
{
	printf("%d ",*ele);
	return 1;
}
posted @ 2018-10-08 22:59  ay-a  阅读(210)  评论(0编辑  收藏  举报