通过结构体指针实现顺序链表的基础操作
2018-02-03 00:27
447 查看
SequenceList.c文件,主要为main函数,操作步骤
#include <stdio.h> #include "SequenceList.h" #include <stdlib.h> /* 初始化顺序表 参数:指向顺序表结构体的指针 */ int InitSequence(List **l) { (*l) = (List *)malloc(sizeof(List) * 1); if (NULL == *l) { return FAILURE; } (*l)->data = (DataType *)malloc(sizeof(DataType) * SIZE); if (NULL == (*l)->data) { return FAILURE; } (*l)->length = 0; return SUCCESS; } /* 判断顺序表是否为空 */ int EmptySequence(List *l) { //return (l.length == 0) ? SUCCESS : FAILURE; if (0 == l->length) { return SUCCESS; } else { return FAILURE; } } int InsertSequence(List *l, int p, DataType e) { int i; if (NULL == l->data || NULL == l || p <= 0 || p > l->length + 1 || l->length >= SIZE) { return FAILURE; } for (i = 0; i < l->length - p + 1; i++) { l->data[l->length - i] = l->data[l->length - i - 1]; } l->data[p - 1] = e; l->length++; return SUCCESS; } /* 顺序表遍历 参数:顺序表 函数指针 指向一个void型函数,函数有一个DataType型形参 */ int TraverseSequence(List *l, void(*p)(DataType)) { int i; for (i = 0 ; i < l->length; i++) { p(l->data[i]); } return SUCCESS; } /* 获取指定位置的元素 参数:l 顺序表 p 位置 e 获取的元素 */ DataType GetElem(List *l, int p, DataType *e) { if (p <= 0 || p > l->length) { return FAILURE; } //*e = l.data[p - 1]; *e = *(l->data + p - 1); return SUCCESS; } /* 查找元素 参数:l 顺序表 e 要查找的元素 p 函数指针 */ int LocateElem(List *l, DataType e, int(*p)(DataType, DataType)) { int i; for (i = 0; i < l->length; i++) { if (p(e, l->data[i])) { return i + 1; } } return FAILURE; } /* 获取元素的前驱 参数:l 顺序表 e 查找的元素 */ DataType PriorElem(List *l, DataType e) { int i; for (i = 1; i < l->length; i++) { if (e == l->data[i]) { return l->data[i - 1]; } } return FAILURE; } /* 获取元素的后继 */ DataType NextElem(List *l, DataType e) { int i; for (i = 0; i < l->length - 1; i++) { if (e == l->data[i]) { return l->data[i + 1]; } } return FAILURE; } /* 删除元素 参数:l 指向顺序表的指针 p 要删除元素的位置 e 删除的元素 */ int DeleteSequence(List *l, int p, DataType *e) { int i; if (NULL == l || p <= 0 || p > l->length) { return FAILURE; } *e = l->data[p - 1]; for (i = 0; i < l->length - p; i++) { l->data[p - 1 + i] = l->data[p + i]; } l->length--; return SUCCESS; } int LengthSequence(List *l) { return (l->length); } /* 清空顺序表 */ int ClearSequence(List *l) { l->length = 0; return SUCCESS; } /* 销毁顺序表 */ int DestroySequence(List **l) { free((*l)->data); free(*l); *l = NULL; return SUCCESS; }SequenceList.h 文件
#ifndef _SEQUENCELIST_H_ #define _SEQUENCELIST_H_ #define SIZE 10 #define FAILURE 10000 #define SUCCESS 10001 typedef int DataType; struct SequenceList { DataType *data; int length; }; typedef struct SequenceList List; int InitSequence(List **l); int EmptySequence(List *l); int InsertSequence(List *l, int p, DataType e); int TraverseSequence(List *l, void (*p)(DataType)); DataType GetElem(List *l, int p, DataType *e); int LocateElem(List *l, DataType e, int(*p)(DataType, DataType)); DataType PriorElem(List *l, DataType e); DataType NextElem(List *l, DataType e); int DeleteSequence(List *l, int p, DataType *e); int LengthSequence(List *l); int ClearSequence(List *l); int DestroySequence(List **l); #endifTestSequence文件,各操作功能的函数实现
#include <stdio.h> #include "SequenceList.h" void visit(DataType e) //打印元素,作为函数参数传入 { printf("%d ", e); } int Equal(DataType a, DataType b) { return (a == b) ? 1 : 0; } int main() { int ret, i, p; List *list; //定义一个顺序表 DataType e; ret = InitSequence(&list); //初始化顺序表 if (FAILURE == ret) { printf("Init Failure!\n"); } else { printf("Init Success!\n"); } ret = EmptySequence(list); if (SUCCESS == ret) { printf("Sequence Empty!\n"); } else { printf("Sequence not Empty!\n"); } for (i = 0; i < 8; i++) { ret = InsertSequence(list, i + 1, i + 1); //向顺序表插入元素 if (FAILURE == ret) { printf("Insert %d Failure!\n", i + 1); } else { printf("Insert %d Success!\n", i + 1); } } ret = EmptySequence(list); //判断顺序表是否为空 if (SUCCESS == ret) { printf("Sequence Empty!\n"); } else { printf("Sequence not Empty!\n"); } ret = TraverseSequence(list, visit); //遍历顺序表 if (FAILURE == ret) { printf("Traverse Failure!\n"); } else { printf("\nTraverse Success!\n"); } p = 13; //位置 ret = GetElem(list, p, &e); //获取指定位置的元素 if (FAILURE == ret) { printf("Get %dth Element Failure!\n", p); } else { printf("%dth Element is %d\n", p, e); } e = 14; ret = LocateElem(list, e, Equal); //查找元素位置 if (FAILURE == ret) { printf("Locate %d Failure!\n", e); } else { printf("%d is %dth Element!\n", e, ret); } e = 12; ret = PriorElem(list, e); if (FAILURE == ret) { printf("%d has no prior!\n", e); } else { printf("%d Prior is %d\n", e, ret); } e = 8; ret = NextElem(list, e); if (FAILURE == ret) { printf("%d has no next!\n", e); } else { printf("%d Next is %d\n", e, ret); } for (i = 0; i < 3; i++) { ret = DeleteSequence(list, 1, &e); if (FAILURE == ret) { printf("Delete Failure!\n"); } else { printf("Delete %d Success!\n", e); } } ret = TraverseSequence(list, visit); //遍历顺序表 if (FAILURE == ret) { printf("Traverse Failure!\n"); } else { printf("\nTraverse Success!\n"); } printf("Sequence Length %d\n", LengthSequence(list)); ret = ClearSequence(list); if (FAILURE == ret) { printf("Clear Failure!\n"); } else { printf("Clear Success!\n"); } ret = DestroySequence(&list); if (FAILURE == ret) { printf("Destroy Failure!\n"); } else { printf("Destroy Success!\n"); } for (i = 0; i < 8; i++) { ret = InsertSequence(list, i + 1, i + 1); //向顺序表插入元素 if (FAILURE == ret) { printf("Insert %d Failure!\n", i + 1); } else { printf("Insert %d Success!\n", i + 1); } } return 0; }
相关文章推荐
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
- 通过操作指针,与指针做函数参数'实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换
- 数据结构基础 之 双链表 与 循环链表 各类操作、思想与实现
- 大头锻炼日记2 -- 无指针和结构体的vbscript中实现单向链表
- 链表基础操作与常见题目Java实现
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- 通过结构体实现学生信息的操作
- 数据结构-链表的基础操作实现
- 顺序链表的常用操作实现及注意事项
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- 第六天2017/04/11(1:结构体链表基础和相关经典操作)
- 结构体指针链表基础练习(源代码)
- 顺序表(Seqlist)&链表(List)的基础操作
- c++ 模板类实现 动态顺序表 基础操作
- 通过链表实现,13个人围成一圈,从第一个开始顺序报号1、2、3.凡报到3者推出圈子,找出打印并最后人的序号
- 链表基础操作+实例[C语言实现]
- 文章标题C语言实现单链表之基础操作
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
- 通过链表实现栈的基本操作
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作