sdvs

#include <iostream>
#include <stdlib.h>
using namespace std;

#define MAXSIZE 100
typedef int ElemType;
/*线性表的静态链表存储结构*/
typedef struct
{
	ElemType data;
	int cur;//为0时表示没有后继的元素,类似于NULL
}StaticLinkList[MAXSIZE];

/*将一维数组array中各个分量链成一个备用链表,array[0].cur为头指针,“0”表示空指针*/
bool InitList(StaticLinkList array)
{
	cout << "InitList..." << endl;
	for(int i = 0; i < MAXSIZE - 2; i++)
	{
		array[i].cur = i + 1;
	}
	array[MAXSIZE - 2].cur = 0;/*最后一个元素是不可以用的,倒数第二个元素的cur为0,表示备用链表的结尾NULL*/
	array[MAXSIZE - 1].cur = 0;/*目前链表为空表,最后一个元素的cur为0*/

	return true;
}

/*若备用链表非空,则返回分配的结点下标,否则返回0*/
int Malloc_SLL(StaticLinkList array)
{
	int i = array[0].cur;
	if(i != 0)
	{
		array[0].cur = array[i].cur;/*下一个空结点用来作备用*/
	}

	return i;
}

/*将下标为k的空闲结点回收到备用链表*/
void Free_SLL(StaticLinkList array, int k)
{
	array[k].cur = array[0].cur;/*把第一个元素的cur值赋值给要删除元素的cur*/
	array[0].cur = k;/*把要删除元素的下标赋值给第一个元素的cur值	*/
}

/*获取静态链表中元素的个数*/
int ListLength(StaticLinkList array)
{
	int count = 0;
	int index = array[MAXSIZE - 1].cur;
	while(index != 0)
	{
		count++;
		index = array[index].cur;
	}//while

	return count;
}

/*在array中第pos个元素之前插入新的数据元素elem*/
bool ListInsert(StaticLinkList array, int pos, ElemType elem)
{
	cout << "Insert List from pos: " << pos << "Item" << elem << endl;
	if(pos < 1 || pos > ListLength(array) + 1)/*1<=pos<=ListLength(array)+1*/
	{
		return false;
	}
	int index = MAXSIZE - 1;
	int k = Malloc_SLL(array);/*获取空闲分量的下标*/
	if(k)
	{
		array[k].data = elem;

		for(int i = 1; i < pos; i++)
		{
			index = array[index].cur;
		}
		array[k].cur = array[index].cur;/*把第pos个元素之前的那个元素的cur赋值给新元素的cur*/
		array[index].cur = k;/*把新元素的下标赋值给第pos个元素之前的元素的cur*/

		return true;
	}

	return false;
}

/*删除array中第pos个数据元素*/
bool ListDelete(StaticLinkList array, int pos)
{
	cout << "Delete List from pos: " << pos << endl;
	if(pos < 1 || pos > ListLength(array))
	{
		return false;
	}

	int index = MAXSIZE - 1;
	for(int i = 1; i < pos; i++)//定位到第pos个元素之前的那个元素
	{
		index = array[index].cur;
	}
	int tempIndex = array[index].cur;
	array[index].cur = array[tempIndex].cur;
	Free_SLL(array, tempIndex);

	return true;
}

bool ListTraverse(StaticLinkList array)
{
	cout << "List Traverse: " << endl;
	int index = MAXSIZE - 1;

	while(array[index].cur != 0)
	{
		index = array[index].cur;
		cout << array[index].data << ‘ ‘;
	}
	cout << endl;

	return true;
}

int main(void)
{
	StaticLinkList SLL;
	InitList(SLL);
	for(int i= 1; i < 11; i++)
	{
		ListInsert(SLL, i, i);
	}

	ListTraverse(SLL);

	ListDelete(SLL, 3);

	ListTraverse(SLL);
	cout << "List Length:" << ListLength(SLL) << endl;

	system("pause");
	return 0;
}
时间: 2024-08-28 23:31:21

sdvs的相关文章