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_
声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。