线性表链式存储结构相关操作函数

 1. 线性表链式存储结构相关操作函数

这是链式存储结构常用的函数操作

(1)建立线性表L

(2)判断线性表是否为空

(3)将线性表清空

(4)取出线性表L中第i个位置的值

(5)查找线性表L中与给定值e相同的元素,成功返回1,失败返回0

(6)在线性表L中第i 个位置插入元素e

(7)删除线性表L中第i个元素

(8)求线性表L的元素个数

(9)求线性表的最大容量
 

 

 

 

Linklist.c文件

#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"

//typedef void LinkList;
//typedef struct _tag_LinkListNode LinkListNode;



typedef struct _tag_LinkList
{
	LinkListNode header;			//	此处结构体嵌套结构体
	int length;

}TLinkList;


//创建线性表链式存储结构
LinkList * LinkList_Create()										//void类型的指针函数
{
	TLinkList * ret = (TLinkList*)malloc(sizeof(TLinkList));		//T结构体类型的指针

	if (ret != NULL)												//确认分配成功
	{
		ret->length = 0;
		ret->header.next = NULL;
	}

	return ret;														//返回了指针的地址


}


//销毁链表的函数

//此处只销毁了头部第一个节点,后边的节点都没有被销毁


void LinkList_Destroy(LinkList* list)					//O(1)
{
	free(list);
}



//清空链表的函数
void LinkList_Clear(LinkList* list)		//O(1)
{
	TLinkList * sList = (TLinkList*)list;			//强制将LinkList类型的指针地址转换成TLinkList类型的地址
	if (sList != NULL)
	{
		sList->length = 0;
		sList->header.next = NULL;
	}
}


//求出线性表的链式存储的长度
int LinkList_Length(LinkList* list)				//O(1)
{
	TLinkList* sList = (TLinkList*)list;			//强制将LinkList类型的指针地址转换为TLinkList类型指针的地址
	int ret = -1;

	if (sList != NULL)
	{
		ret = sList->length;						//取出链表的长度
	}

	return ret;
}


//在线性表链式存储结构中插入节点,此时是将节点node插入在pos节点之后
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
	TLinkList* sList = (TLinkList*)list;
	int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
	int i = 0;
	if (ret)
	{
		LinkListNode* current = (LinkListNode*)sList;

		for (i = 0; (i < pos) && (current->next != NULL); i++)
		{
			current = current->next;							//当未搜索到pos位置时,搜索current节点的下一个节点,故将其下一个节点的地址赋给current
		}
		
		//找到pos位置之后,将执行下边三步操作
		node->next = current->next;
		current->next = node;

		sList->length++;

	}

	return ret;
}


//获取pos位点的数据
LinkListNode * LinkList_Get(LinkList* list, int pos)		//O(n)   结构体指针函数
{
	TLinkList* sList = (TLinkList*)list;			//将LinkList类型指针的地址强制转换为TLinkList类型的指针地址,并将其赋值给TLinkList类型的sList指针
	LinkListNode * ret = NULL;
	int i = 0;

	if ((sList != NULL) && (0 <= pos) && (pos < sList->length))
	{
		LinkListNode* current = (LinkListNode*)sList;

		for (i = 0; i < pos; i++)
		{
			current = current->next;
		
		}
		ret = current->next;
	}

	return ret;
}

//删除pos点的信息


LinkListNode* LinkList_Delete(LinkList* list, int pos)		//O(n)
{
	TLinkList * sList = (TLinkList*)list;
	LinkListNode * ret = NULL;
	int i = 0;

	if ((sList != NULL) && (0 <= pos) && (pos < sList->length))
	{
		LinkListNode * current = (LinkListNode*)sList;

		for (i = 0; i < pos; i++)
		{
			current = current->next;						//寻找pos位置

		}


		//找到pos位置后进行如下操作

		ret = current->next;
		current->next = ret->next;

		sList->length--;

	}



	return ret;
}

 

 

LinkList.h

 

//#pragma once


#ifndef _LINKLIST_H_
#define _LINKLIST_H_


typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;

struct _tag_LinkListNode
{
	LinkListNode* next;

};


//创建链表函数
LinkList * LinkList_Create();

//销毁链表函数
void LinkList_Destroy(LinkList* list);

//清空链表
void LinkList_Clear(LinkList* list);

//求出链表的长度
int LinkList_Length(LinkList* list);

//向链表中插入相应的节点
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);

//获取链表指定未知的数据
LinkListNode* LinkList_Get(LinkList* list, int pos);

//删除链表指定位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos);







#endif // _LINKLIST_H_

 

    原文作者:dutu
    原文地址: https://blog.csdn.net/u011733907/article/details/96011504
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞