静态链表的初始化、插入、删除

#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;
            
阅读更多
换一批

没有更多推荐了,返回首页