C语言简单实现线性表的链式存储结构(单链结构)
2021-04-10 02:27
标签:信息 linked 释放 元素 验证 sel 就是 etl intel 为了方面使用,先定义头文件ElemType 注发现上面代码框的代码和下面代码框的代码均包含了语句#include 会不会造成不好的结果呢? 详情请点击链接 C语言中包含一个头文件多次的后果以及解决方案 因为stdio.h使用了 #ifndef #endif 故不会产生不良影响 实现单链表的定义 单链表基本操作的简单实现 测试定义好的单链表和其基本操作的功能 之后可能会实现双链结构吧:) C语言简单实现线性表的链式存储结构(单链结构) 标签:信息 linked 释放 元素 验证 sel 就是 etl intel 原文地址:https://www.cnblogs.com/RGBTH/p/13371316.html#include "stdio.h"
typedef double ElemType;
//操作成功
#define OK 1
//操作错误
#define ERROR 0
//操作异常
#define OVERFLOW -2
//定义元素类型,int可使用基本数据类型和用户自定义数据类型替换,根据使用场景选择
typedef int Status ;
double absForDouble(double a);
/**
* 求绝对值
* @param a
* @return 返回a的绝对值
*/
double absForDouble(double a) {
if (a 0)return -a;
return a;
}
/**
* 实现两个ElemType类型变量的匹配
* @param e1 ElemType类型变量e1
* @param e2 ElemType类型变量e2
* @return 匹配结果,1表示匹配,0表示不匹配
*/
int match(ElemType e1, ElemType e2){
if(absForDouble(e1-e2)6)
return 1;
return 0;
}
/**
* 打印数据元素
*/
printElem(ElemType e){
printf("Current element‘s data is %lf!\n",e);
}
#include "ElemType.h"
#include "stdlib.h"
#include
/**
* 单链表基本操作的实现
*/
/**
* 初始化
* 算法描述:1、新建头结点,使头指针L指向头结点
* 2、置头结点的指针域为空(NULL)
* @param L 指向单链表头指针的指针(实现动态内存的传递)
* @return 操作结果状态码
*/
Status initLinkedList(LinkedList *L) {
//新建头结点,使头指针L指向头结点
*L = (LNode *) malloc(sizeof(LNode));
//新建结点失败
if (!L) return OVERFLOW;
//置头结点的指针域为空(NULL)
(*L)->next = NULL;
(*L)->data = 0;
return OK;
}
/**
* 销毁单链表
* 算法描述:
* 1、判断指向头指针的指针L指向的指针是否指向NULL
* 2、若L指向NULL,则单链表已被销毁,或者单链表为初始化,无法销毁,返回ERROR
* 3、若L不指向NULL,定义指向当前结点的指针p并使其指向头结点
* 4、定义临时指针t指向NULL
* 5、使用循环销毁结点,首先使指针t指向指向当前结点的指针p指向的结点的直接后继,销毁指针p指向的结点,使p指向指针t指向的结点,若p!=NULL,再次循环
* 6、置指针L,p,t指向NULL
* 7、返回OK
* @param L 指向单链表头结点的指针L
* @return 操作结果状态码
*/
Status destroyLinkedList(LinkedList *L) {
//判断指向头指针的指针L指向的指针是否指向NULL
//L指向NULL,则单链表已被销毁,或者单链表为初始化,无法销毁,返回ERROR
if (!(*L)) {
return ERROR;
}
//若L不指向NULL,定义指向当前结点的指针p并使其指向头结点
LNode *p = *L;
//定义临时指针t指向NULL
LNode *t = NULL;
while (p) {
//使指针t指向指向当前结点的指针p指向的结点的直接后继
t = p->next;
//销毁指针p指向的结点
free(p);
//使p指向指针t指向的结点
p = t;
}
//置指针L,p,t指向NULL
t = NULL;
p = NULL;
L = NULL;
////返回OK
return OK;
}
/**
* 清空单链表
* 算法描述:
* 1、判断指向头指针的指针L指向的指针是否指向NULL
* 2、若L指向NULL,则单链表已被销毁,或者单链表为初始化,无法清空,返回ERROR
* 3、若L不指向NULL,定义指向当前结点的指针p并使其指向首元结点
* 4、定义临时指针t指向NULL
* 5、使用循环销毁结点,首先使指针t指向指向当前结点的指针p指向的结点的直接后继,销毁指针p指向的结点,使p指向指针t指向的结点,若p!=NULL,再次循环
* 6、置指针p,t指向NULL
* 7、置头结点的指针域为NULL
* 8、返回OK
* @param L 指向单链表的头指针的指针
* @return 操作结果状态码
*/
Status clearLinkedList(LinkedList *L) {
//判断指向头指针的指针L指向的指针是否指向NULL
//L指向NULL,则单链表已被销毁,或者单链表为初始化,无法清空,返回ERROR
if (!(*L)) {
return ERROR;
}
//若L不指向NULL,定义指向当前结点的指针p并使其指向头结点
LNode *p = (*L)->next;
//定义临时指针t指向NULL
LNode *t = NULL;
while (p) {
//使指针t指向指向当前结点的指针p指向的结点的直接后继
t = p->next;
//销毁指针p指向的结点
free(p);
//使p指向指针t指向的结点
p = t;
}
//置头结点的指针域为NULL
(*L)->next = NULL;
//置指针p,t指向NULL
t = NULL;
p = NULL;
////返回OK
return OK;
}
/**
* 判断单链表是否为空表
* 算法描述:
* 1、判断指针L的合法性(是否等于NULL),若等于NULL,置res指向的存储单元的值为0,返回ERROR
* 1、只需更加头指针L的指针域即可判断,若L->next=NULL,则单链表是空表,若L->next!=NULL,则单链表不是空表,综上返回L指针域值的取反值即可
* @param L 指向单链表的头指针L
* @param res 指向保存单链表是否为空表的信息的存储单元的指针res
* @return 操作结果状态码
*/
Status isEmpty(LinkedList L, int *res) {
if (!L) {
*res = 0;
return ERROR;
}
//只需更加头指针L的指针域即可判断,若L->next=NULL,则单链表是空表,若L->next!=NULL,则单链表不是空表,综上返回L指针域值的取反值即可
*res = !L->next;
return OK;
}
/**
* 获取单链表的长度
* 算法描述:
* 1、判断头指针L是是否等于NULL,若等于NULL,表示单链表未初始化或已经被销毁,置指针len指向的存储单元的值为-1,返回ERROR
* 2、定义指向当前结点的指针p并使其指向单链表的头结点
* 3、定义计数器j记录指针p由头结点移动至尾结点需要移动的次数,即单链表的长度,置j初始值为零
* 4、循环移动指针p的位置并使计数器自增,直至p=NULL(表示指针p指向尾结点的后继)
* 5、置指针len指向存储单元的值为变量j的值
* 6、使指针p指向NULL,返回OK
* @param L 指向单链表的头结点的头指针L
* @param len 指向用以保存单链表长度的指针len
* @return
*/
Status getLength(LinkedList L, int *len) {
//判断头指针L是是否等于NULL,若等于NULL,表示单链表未初始化或已经被销毁,置指针len指向的存储单元的值为-1,返回ERROR
if (!L) {
*len = -1;
return ERROR;
}
//定义指向当前结点的指针p并使其指向单链表的头结点
LNode *p = L->next;
//定义计数器j记录指针p由头结点移动至尾结点需要移动的次数,即单链表的长度,置j初始值为零
int j = 0;
//循环移动指针p的位置并使计数器自增,直至p=NULL(表示指针p指向尾结点的后继)
while (p) {
p = p->next;
++j;
}
//置指针len指向存储单元的值为变量j的值
*len = j;
//返回OK
p = NULL;
return OK;
}
/**
* 取值,取单链表的第i个元素(i>0且i
int main() {
LinkedList L = NULL;
/*initLinkedList(&L);
double d;
if (insertLNode(&L, 1, 2.2)) {
if (insertLNode(&L, 2, 3)) {
if (getElem(&L, 1, &d)) {
printf("%lf\n", d);
}
}
}
int i;
d = 3.0;
if (indexOf(L, &i, d)) {
printf("%d\n", i);
}
LNode *p = locateElem(L, d);
//查找成功,使用结点地址访问结点数据域
//查找失败,输出结点地址,验证是否为NULL
if (p) {
printf("%lf\n", p->data);
} else {
printf("%d\n", p);
}
deleteNode(&L, 4);
d = 3.0;
if (indexOf(L, &i, d)) {
printf("%d\n", i);
} else {
printf("%d\n", i);
}*/
//测试前插法
/*if (createLinkedListByInsertNewNodeAfterHeadNode(&L, 10)) {
double d;
if (getElem(L, 7, &d)) {
printf("%lf\n", d);
}
}*/
//测试后插法
if (createLinkedListByInsertNewNodeAfterRearNode(&L, 10)) {
double d;
if (getElem(L, 7, &d)) {
printf("%lf\n", d);
}
}
//测试销毁单链表
/*destroyLinkedList(&L);*/
//测试获取前趋和后继
//测试前趋
double curE = 1;
LNode *prior = NULL;
priorElem(L, curE, &prior);
if (prior) {
printf("The data of prior node of node which data is curE is %lf\n", prior->data);
} else {
printf("The node whose data i curE has not prior node!\n");
}
//测试后继
LNode *next = NULL;
curE = 9;
nextElem(L, curE, &next);
if (next) {
printf("The data of next node of node which data is curE is %lf\n", next->data);
} else {
printf("The node whose data i curE has not next node!\n");
}
//测试遍历单链表
traverseList(L);
//测试清空单链表
//测试判断单链表是否为空表
int res = 0;
isEmpty(L, &res);
if (res) {
printf("The LinkedList is a empty table.\n");
} else {
printf("The LinkedList isn‘t a empty table.\n");
}
//测试获取单链表长度
int length = 0;
getLength(L, &length);
if (length 0) {
printf("The LinkedList has not been initialized or the LinkedList has been distroyed!\n");
} else {
printf("The LinkedList‘s length is %d!\n", length);
}
clearLinkedList(&L);
//测试判断单链表是否为空表
isEmpty(L, &res);
if (res) {
printf("The LinkedList is a empty table.\n");
} else {
printf("The LinkedList isn‘t a empty table.\n");
}
//测试获取单链表长度
getLength(L, &length);
if (length 0) {
printf("The LinkedList has not been initialized or the LinkedList has been distroyed!\n");
} else {
printf("The LinkedList‘s length is %d!\n", length);
}
if (L) {
printf("The LinkedList has not been destroyed!");
free(L);
}
next = NULL;
prior = NULL;
L = NULL;
return 0;
}
文章标题:C语言简单实现线性表的链式存储结构(单链结构)
文章链接:http://soscw.com/index.php/essay/73589.html