头文件
#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; }