#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define TRUE 1
#define ERROR -1
#define FALSE -1
#define OVERFLOW -2
#define ElemType int
#define Status int
//------静态链表 X 使用数组实现链表,可以在没有指针的编程语言中实现链表结构
#define MAXSIZE 1000 //假设链表的最大长度是1000
//封装 静态链表
typedef struct
{
ElemType data;//数据
int cur; //游标(Cursor),为0时表示无指向
} Component, StaticLinkList[MAXSIZE]; //声明为StaticLinkList[MAX_SIZE]
//初始化静态链表
Status Initlist(StaticLinkList space) //将一维数组space中各分量链成一备用链表
{ int i;
for (i = 0; i < MAXSIZE - 1; i++)
space[i].cur = i + 1;//space[0].cur为头指针,“0”表示空指针
space[MAXSIZE - 1].cur = 0;//目前静态链表为空,最后一个元素的cur为0
return OK;
}
//静态链表的插入操作
//1、创建malloc()函数
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur;//当前数组第一个元素的cur存的值,就是要返回的第一个备用空闲的下标
if (space[0].cur)//若备用链表非空(当space[0].cur为空时,值为0)
space[0].cur = space[i].cur;
return i;
}
//静态链表长度函数:即L中元素个数
int ListLength(StaticLinkList L)
{
int j = 0;
int i = L[MAXSIZE - 1].cur;
while (i)
{
i = L[i].cur;
j++;
}
return j;
}
//2、插入操作(不移动元素,却插入了数据)
//在L中第i个元素之前插入新的数据元素e
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
int j, k, l;
k = MAXSIZE - 1;//k首先是最后一个元素的下标
if(i<1 || i>ListLength(L) + 1)//???
return ERROR;
j = Malloc_SLL(L);//获得空闲分量的下标
if (j)
{
L[j].data = e;//将数据赋值给此分量的data
for (l = 1; l <= i - 1; l++) //找到第i-1个元素的位置
k = L[k].cur; //进行i-1次查找
L[j].cur = L[k].cur;//把第i个元素之前的cur赋值给新元素的cur
L[k].cur = j;//把新元素的下标赋值给第i个元素之前的元素的cur
return OK;
}
return ERROR;
}
//静态链表的删除操作
//1、创建free()函数
//将下标为i的空闲结点回收到备用列表
void Free_SSL(StaticLinkList space, int i)
{
space[i].cur = space[0].cur;//把第一个元素的cur值(用来存放备用链表的第一个结点的下标)赋给要删除的分量cur
space[0].cur = i;//把要删除的分量下标赋值给第一个元素的cur
}
//2、删除操作
//删除在L中第i个元素e
Status ListDelete(StaticLinkList L, int i)
{
int i, k;
if (i<1 || i>ListLength(L))
return ERROR;
k = MAXSIZE - 1;
for (j = 1; j <= i - 1; j++)
k = L[k].cur;
j = L[k].cur;
L[k].cur = L[j].cur;
free_SSL(L, j);
return OK;
}
typedef struct LNode
{
ElemType data;
struct Lnode *next;
}LNode,*LinkList;
这其实是两步:
1、定义结构体:
struct LNode
{
ElemType data;
struct Lnode *next;
};
至于struct Lnode *next;是定义一个struct Lnode结构体类型的指针,当然要有struct Lnode了。就像定义int型,要用int一样。
2、定义类型 LNode:
typedef struct LNode LNode;
就是定义新的类型LNode,即:struct LNode的别名。为了方便调用,少打字。
3、定义类型 LinkList指针:
typedef struct LNode *LinkList;