栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构-C语言代码 day 4-静态链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构-C语言代码 day 4-静态链表

一、静态链表定义

逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。也就是说静态链表是用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构。它的优点是和动态链表一样,删除和插入元素时间复杂度低;不足是和数组一样,需要提前分配一块较大的空间。 

数据存放到数组中时,给各个数据元素配备一个整形变量,此变量用于指明各个元素的直接后继元素所在数组中的位置下标:

上图中,从 a[1] 存储的数据元素 1 开始,通过存储的游标变量 3,就可以在 a[3] 中找到元素 1 的直接后继元素 2;同样,通过元素 a[3] 存储的游标变量 5,可以在 a[5] 中找到元素 2 的直接后继元素 3,这样的循环过程直到某元素的游标变量为 0 截止(因为 a[0] 默认不存储数据元素)。

 通常,静态链表会将第一个数据元素放到数组下标为 1 的位置(a[1])中。

上图通过“数组+游标”的方式存储具有线性关系数据的存储结构就是静态链表。

二、静态链表的实现

创建链表

typedef struct StaticLinkedNode{
	char data;

	int next;
} *NodePtr;

typedef struct StaticLinkedList{
	NodePtr nodes;//存储结点
	int* used;//0空闲  1占用
} *ListPtr;

初始化链表

ListPtr initLinkedList()
{
	//指向整个列表空间的指针 
	ListPtr tempPtr = (ListPtr)malloc(sizeof(struct StaticLinkedList));
	//分配总空间 
	tempPtr->nodes = (NodePtr)malloc(sizeof(struct StaticLinkedNode) * DEFAULT_SIZE);
	tempPtr->used = (int*)malloc(sizeof(int) * DEFAULT_SIZE);
	//头结点
	tempPtr->nodes[0].data = '';
	tempPtr->nodes[0].next = -1;
	//仅使用头结点
	tempPtr->used[0] = 1;
	for (int i = 1; i < DEFAULT_SIZE; i ++)
	{
		tempPtr->used[i] = 0;
	}
	return tempPtr;
}

打印链表

void printList(ListPtr paraListPtr)
{
	int p = 0;
	while (p != -1)
	{
		printf("%c", paraListPtr->nodes[p].data);
		p = paraListPtr->nodes[p].next;
	}
	printf("rn");
}

插入元素

void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition)
{
	int p=0, q, i;
	//寻找位置
	for (i = 0; i < paraPosition; i ++)
	{
		p = paraListPtr->nodes[p].next;
		if (p == -1)
		{
			printf("位置%d超出链表范围rn",paraPosition);
			return;
		}
	}
	//创建新结点
	for (i = 1; i < DEFAULT_SIZE; i ++)
	{
		if (paraListPtr->used[i] == 0)
		{
			//等同于malloc(分配空间)
			printf("%d处已被分配空间rn",i);
			paraListPtr->used[i] = 1;
			q = i;
			break;
		}
	}
	if (i == DEFAULT_SIZE)
	{
		printf("没有空间。rn");
		return;
	}
	paraListPtr->nodes[q].data = paraChar;
	printf("插入%crn",paraChar);
	paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = q;
}

删除元素

 

void deleteElement1(ListPtr paraListPtr, char paraChar)
{
	int p=0, q;
	while ((paraListPtr->nodes[p].next != -1) && (paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar))
	{
		p = paraListPtr->nodes[p].next;
	}
	printf("删除%crn",paraChar);
	if (paraListPtr->nodes[p].next == -1)
	{
		printf("%c无法删除rn",paraChar);
		return;
	}
	q = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
	//此语句与 free(q) 相同
	paraListPtr->used[q] = 0;
}

功能测试

void appendInsertDeleteTest()
{
	// 初始化一个空列表。
	ListPtr tempList = initLinkedList();
	printList(tempList);

	// 添加一些字符。
	insertElement(tempList, 'H', 0);
	insertElement(tempList, 'e', 1);
	insertElement(tempList, 'l', 2);
	insertElement(tempList, 'l', 3);
	insertElement(tempList, 'o', 4);
    insertElement(tempList, 't', 5);
    insertElement(tempList, 'S', 6);
    insertElement(tempList, 'w', 7);
    insertElement(tempList, 'p', 8);
    insertElement(tempList, 'u', 9);
    insertElement(tempList, '!', 10);
	printList(tempList);

	// 删除一些字符(第一次出现)。
	printf("Deleting 'e'.rn");
	deleteElement(tempList, 'e');
	printf("Deleting 'a'.rn");
	deleteElement(tempList, 'a');
	printf("Deleting 's'.rn");
	deleteElement(tempList, 's');
	printList(tempList);

	insertElement(tempList, 'l', 1);
	printList(tempList);
}

全部代码

#include 
#include 

#define DEFAULT_SIZE 5

typedef struct StaticLinkedNode{
	char data;

	int next;
} *NodePtr;

typedef struct StaticLinkedList{
	NodePtr nodes;//存储结点
	int* used;//0空闲  1占用
} *ListPtr;


ListPtr initLinkedList()
{
	//指向整个列表空间的指针 
	ListPtr tempPtr = (ListPtr)malloc(sizeof(struct StaticLinkedList));
	//分配总空间 
	tempPtr->nodes = (NodePtr)malloc(sizeof(struct StaticLinkedNode) * DEFAULT_SIZE);
	tempPtr->used = (int*)malloc(sizeof(int) * DEFAULT_SIZE);
	//头结点
	tempPtr->nodes[0].data = '';
	tempPtr->nodes[0].next = -1;
	//仅使用头结点
	tempPtr->used[0] = 1;
	for (int i = 1; i < DEFAULT_SIZE; i ++)
	{
		tempPtr->used[i] = 0;
	}
	return tempPtr;
}


void printList(ListPtr paraListPtr){
	int p = 0;
	while (p != -1) {
		printf("%c", paraListPtr->nodes[p].data);
		p = paraListPtr->nodes[p].next;
	}// Of while
	printf("rn");
}// Of printList


void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition)
{
	int p=0, q, i;
	//寻找位置
	for (i = 0; i < paraPosition; i ++)
	{
		p = paraListPtr->nodes[p].next;
		if (p == -1)
		{
			printf("位置%d超出链表范围rn",paraPosition);
			return;
		}
	}
	//创建新结点
	for (i = 1; i < DEFAULT_SIZE; i ++)
	{
		if (paraListPtr->used[i] == 0)
		{
			//等同于malloc(分配空间)
			printf("%d处已被分配空间rn",i);
			paraListPtr->used[i] = 1;
			q = i;
			break;
		}
	}
	if (i == DEFAULT_SIZE)
	{
		printf("没有空间。rn");
		return;
	}
	paraListPtr->nodes[q].data = paraChar;
	printf("插入%crn",paraChar);
	paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = q;
}

void deleteElement1(ListPtr paraListPtr, char paraChar)
{
	int p=0, q;
	while ((paraListPtr->nodes[p].next != -1) && (paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar))
	{
		p = paraListPtr->nodes[p].next;
	}
	printf("删除%crn",paraChar);
	if (paraListPtr->nodes[p].next == -1)
	{
		printf("%c无法删除rn",paraChar);
		return;
	}
	q = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
	//此语句与 free(q) 相同
	paraListPtr->used[q] = 0;
}

void appendInsertDeleteTest()
{
	// 初始化一个空列表。
	ListPtr tempList = initLinkedList();
	printList(tempList);

	// 添加一些字符。
	insertElement(tempList, 'H', 0);
	insertElement(tempList, 'e', 1);
	insertElement(tempList, 'l', 2);
	insertElement(tempList, 'l', 3);
	insertElement(tempList, 'o', 4);
    insertElement(tempList, 't', 5);
    insertElement(tempList, 'S', 6);
    insertElement(tempList, 'w', 7);
    insertElement(tempList, 'p', 8);
    insertElement(tempList, 'u', 9);
    insertElement(tempList, '!', 10);
	printList(tempList);

	// 删除一些字符(第一次出现)。
	printf("Deleting 'e'.rn");
	deleteElement(tempList, 'e');
	printf("Deleting 'a'.rn");
	deleteElement(tempList, 'a');
	printf("Deleting 's'.rn");
	deleteElement(tempList, 's');
	printList(tempList);

	insertElement(tempList, 'l', 1);
	printList(tempList);
}


int main(){
	appendInsertDeleteTest();
}// Of main

运行结果

2处已被分配空间
插入e
3处已被分配空间
插入l
4处已被分配空间
插入l
没有空间。
位置5超出链表范围
位置6超出链表范围
位置7超出链表范围
位置8超出链表范围
位置9超出链表范围
位置10超出链表范围
 Hell
Deleting 'e'.
删除e
Deleting 'a'.
删除a
a无法删除
Deleting 's'.
删除s
s无法删除
 Hll
2处已被分配空间
插入l
 Hlll

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853228.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号