关于顺序表—线性表的基础操作代码

头文件

#ifndef _SEQUENCELIST_H
#define _SEQUENCELIST_H

#define SIZE 10
#define SUCCESS	10000 
#define FAILURE	100001
#define TRUE 	100002
#define FALSE 	100003

typedef int Elemtype;
struct Sequencelist
{
	int length;                 //数据域
	Elemtype *data;                  //指针域
};
typedef struct Sequencelist SeList; //把结构体重新申明叫Selist

//函数申明
int SequenceInit(SeList *l);   //初始化操作,建立一个新的线性表l
int SequenceInsrt(SeList *l, int p, Elemtype e); //在线性表l的第p个位置插入新元素e    
int SequenceLength(SeList l);  // 返回线性表l的元素个数
int ListEmpty(SeList l); //若线性表为空,返回TRUE,否则返回false
int GetElem(SeList l, int p, Elemtype *e); //将线性表中第p个位置的元素返回给e
int SequenceTraverse(SeList l, void (*p)(Elemtype));   //遍历线性表
int LocateElem(SeList l, Elemtype e); //在线性表l中查找与给定值e相等的元素,若查找成功,返回该元素在表中的序号,否则,返回0表示失败
int SequenceDelete(SeList *l, int p, Elemtype *e); //删除线性表l中的第p个位置的元素,并用e返回其值
int SequenceClear(SeList *l); //清空
int SequenceDestroy(SeList *l); //销毁线性表

#endif

自定义函数

#include "Sequencelist.h"
#include <stdlib.h>

int SequenceInit(SeList *l)  //因为要改变实参中lengh的值,所以这里取地址。
{
	if(NULL == l)            //入参判断
	{
		return FAILURE;
	}
	
	l -> length = 0;       //初始化线性表,长度为0
	l -> data = (Elemtype *) malloc (sizeof(Elemtype *) * SIZE); //为data分配空间
	
	return SUCCESS;
}


int SequenceInsrt(SeList *l, int p, Elemtype e)
{
	int i;
	
	if(NULL == l)
	{
		return FAILURE;
	}
	
	if(p > l->length + 1 || l->length >= SIZE || p < 1)
	{
		return FAILURE;
	}
	
	for(i = 0; i < l->length - p + 1; i++)     //把p+1位置开始的值依次后移一位
	{
		l -> data[l -> length - i] = l -> data[l -> length - i - 1];
	}
	
	l -> data[p - 1] = e;       //插入e元素
	l -> length++;
	
	return SUCCESS;
}


int SequenceLength(SeList l)
{
	return l.length;
}


int ListEmpty(SeList l)
{
	return (l.length == 0) ? TRUE : FALSE;
}


int GetElem(SeList l, int p, Elemtype *e)
{
	if(p < 1 || p > l.length)
	{
		return FAILURE;
	}
	*e = l.data[p - 1];
	
	return SUCCESS;
}


int SequenceTraverse(SeList l, void (*p)(Elemtype))
{
	if(NULL == p)
	{
		return FAILURE;
	}
	
	int i;
	for(i = 0; i < l.length; i++)
	{
		p(l.data[i]);
	}
	
	return SUCCESS;
}


int LocateElem(SeList l, Elemtype e)
{
	int i;
	for(i = 0; i < l.length ; i++)
	{
		if(l.data[i] == e)
		{
			return i + 1;
		}
	}
	
	return FAILURE;
}


int SequenceDelete(SeList *l, int p, Elemtype *e)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	
	if(p < 1 || p > l -> length)
	{
		return FAILURE;
	}
	
	int i;
	*e = l -> data[p - 1];
	for(i = 0;i < l -> length; i++)
	{
		l -> data[p - 1 + i] = l -> data[p - i];
	}
	l -> length--;
}


int SequenceClear(SeList *l)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	
	l -> length = 0;
	
	return SUCCESS;
}


int SequenceDestroy(SeList *l)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	
	l -> length = 0;
	free(l -> data);
	l -> data = NULL;
	
	return SUCCESS;
}

mian主函数

#include "Sequencelist.h"  //""默认当前文件夹的头文件,然后再是系统文件夹
#include <stdio.h>         //<>是在系统的头文件目录下加载头文件

void print(Elemtype e)
{
	printf("%d ",e);
}

int main()
{
	int ret, i;
	SeList list;   //创建了一个结构体
	srand(time(NULL));
	
	
	/*************************/
	
	printf("创建一个空的线性表:\n");
	ret = SequenceInit(&list);  //创建一个空的线性表
	if(SUCCESS == ret)
	{
		printf("Init Success!\n");
	}
	else
	{
		printf("Init Failure!\n");
	}
	printf("\n");
	
	/*************************/
	
	printf("随机插入6个数!:\n");
	for(i = 0; i < 6; i++)
	{
		ret = SequenceInsrt(&list, i+1, rand() % 10);  //rand函数产生一个随机数
		if(FAILURE == ret)
		{
			printf("Insert Failure!\n");
		}
		else
		{
			printf("Insert Success!\n");
		}
	}
	printf("\n");
	
	/*************************/
	
	printf("输出线性表的长度:\n");
	ret = SequenceLength(list);
	printf("%d\n",ret);
	printf("\n");
	
	/*************************/
	
	printf("检查线性表是否为空!:\n");
	ret = ListEmpty(list);
	if(TRUE == ret)
	{
		printf("is empty!\n");
	}
	else
	{
		printf("not empty!\n");
	}
	printf("\n");
	
	/*************************/
	
	printf("输出第p=3个位置上的数:\n");
	int p = 3;
	Elemtype e;
	
	ret = GetElem(list, p, &e);
	if(FAILURE == ret)
	{
		printf("Get Element Failure!\n");
	}
	else
	{
		printf("%dth element is %d!\n",p,e);
	}
	printf("\n");
	
	
	/*************************/
	
	printf("遍历输出线性表:\n");
	ret = SequenceTraverse(list, print);
	if(FAILURE == ret)
	{
		printf("Traverse Failure!\n");
	}
	else
	{
		printf("Traverse Success!\n");
	}
	printf("\n");
	
	/*************************/
	
	printf("输出与e=3相同的元素,返回序号:\n");
	e = 3;
	ret = LocateElem(list, e);
	if(FAILURE == ret)
	{
		printf("%d not exist!\n",e);
	}
	else
	{
		printf("%d is %dth element!\n",e,ret);
	}
	printf("\n");
	
	/*************************/
	
	printf("删除第p=4位置上的元素,并返回其值:\n");
	p = 4;
	ret = SequenceDelete(&list,p,&e);
	printf("The delete number is %d\n",e);
	printf("\n");
	//删除完成,重新遍历输出
	ret = SequenceTraverse(list, print);                              
    if(ret == FAILURE)
    {
        printf("Traerse Failure!\n");
    }
    else
    {
        printf("Traverse Success!\n");
    }
	printf("\n");
	
	/*************************/
	
	printf("清空线性表:\n");
	ret = SequenceClear(&list);
	if(SUCCESS == ret)
	{
		printf("Clear Success!\n");
	}
	else
	{
		printf("Clear Failure!\n");
	}
	
	//清空完成,重新遍历
    if(ret == FAILURE)
    {
        printf("Traerse Failure!\n");
    }
    else
    {
        printf("Traverse Success!\n");
    }	
	printf("\n");
	
	/*************************/
	
	printf("销毁线性表!:\n");
	ret = SequenceDestroy(&list);
	if(SUCCESS == ret)
	{
		printf("Destroy Success!\n");
	}
	else
	{
		printf("Destroy Failure!\n");
	}
	printf("\n");
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wow66lfy/article/details/81367438