关于顺序表—线性表的基础操作代码
其他
2018-08-10 02:06:44
阅读次数: 0
头文件
#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