#include<string.h>
#include<malloc.h> /* malloc()等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<math.h> /* floor(),ceil(),abs() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType; // 定义元素的类型为整型
//定义链表
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */
//返回第i个元素
Status GetElem(LinkList L,int i,ElemType *e)
{
/* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
int j=1; /* j为计数器 */
LinkList p=L->next; /* p指向第一个结点 */
while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */
{
p=p->next;
j++;
}
if(!p||j>i) /* 第i个元素不存在 */
return ERROR;
*e=p->data; /* 取第i个元素 */
return OK;
}
//在第i个位置插入e
Status ListInsert(LinkList L,int i,ElemType e)
{
/* 在带头结点的单链线性表L中第i个位置之前插入元素e */
int j=0;
LinkList p=L,s;
while(p&&j<i-1) /* 寻找第i-1个结点 */
{
p=p->next;
j++;
}
if(!p||j>i-1) /* i小于1或者大于表长 */
return ERROR;
s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data=e; /* 插入L中 */
s->next=p->next;
p->next=s;
return OK;
}
//第i个元素,并由e返回其值
Status ListDelete(LinkList L,int i,ElemType *e)
{
/* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1) /*寻找第i个结点,并令p指向其前趋 */
{
p=p->next;
j++;
}
if(!p->next||j>i-1) /* 删除位置不合理 */
return ERROR;
q=p->next; /* 删除并释放结点 */
p->next=q->next;
*e=q->data;
free(q);
return OK;
}
// 显示链表中的元素,返回值为链表元素的数目
int ShowList(LinkList L)
{
int numOfList = 0; // 记录链表中元素的数目
LinkList p = L->next; // 用来遍历链表元素的指针
while(p) // 如果该结点不为空
{
if(numOfList) // 如果该元素不是列表中的第一个元素(先判断值是否为0,然后加1)
{
putchar(' ');
}
numOfList++; // 元素的数目加1
printf("%d",p->data); // 输出元素
p = p->next; // 指针向后移动
}
if(numOfList == 0) // 如果链表中的元素数目为0,说明是空链表
{
return 0;
}
else
{
putchar('\n'); // 注意换行
return numOfList; // 返回链表中元素的数目
}
}
链表
最新推荐文章于 2022-03-07 21:13:18 发布