带头结点的单链表的实现
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
带头结点的单链表的结构定义:
typedef int ElemType;
typedef struct Node
{
union
{
int length;
ElemType data;
};
struct Node *next;
}HSNode, *HLinkList;
void InitHLinkList(HLinkList head);
void DestroyHLinkList(HLinkList head);
bool InsertHLinkListPos(HLinkList head, ElemType value, int pos);
ElemType FindOFIndex(HLinkList head, int index);
int Length(HLinkList head);
// 删除
bool DeleteHLinkListPos(HLinkList head, int pos);
// 判空
bool Empty(HLinkList head);
// 显示
void Show(HLinkList head);
具体实现:
#include "linklisthead.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void InitHLinkList(HLinkList head)
{
if (head == nullptr) exit(0);
head->length = 0;
head->next = nullptr;
}
void DestroyHLinkList(HLinkList head)
{
if (head == nullptr) exit(0);
while (!Empty(head))
{
DeleteHLinkListHead(head);
}
}
bool InsertHLinkListPos(HLinkList head, ElemType value, int pos)
{
if (head == nullptr) exit(0);
if (pos < 0 || pos > Length(head))
{
printf("Insert Fail: Pos is error\n");
return false;
}
HLinkList p = head;
while (pos)
{
p = p->next;
pos--;
}
HLinkList new_node = (HLinkList)malloc(sizeof(HSNode));
if (new_node == nullptr)
{
printf("Insert Fail: Apply Node Fail\n");
return false;
}
new_node->data = value;
new_node->next = p->next;
p->next = new_node;
head->length++;
return true;
}
bool InsertHLinkListHead(HLinkList head, ElemType value)
{
return InsertHLinkListPos(head, value, 0);
}
bool InsertHLinkListRear(HLinkList head, ElemType value)
{
return InsertHLinkListPos(head, value, Length(head));
}
void Show(HLinkList head)
{
if (head == nullptr) exit(0);
HLinkList p = head->next;
while (p != nullptr)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
ElemType FindOFIndex(HLinkList head, int index)
{
if (head == nullptr) exit(0);
if (index < 0 || index >= Length(head)) throw "index error";
HLinkList p = head->next;
while (index)
{
p = p->next;
index--;
}
return p->data;
}
int Length(HLinkList head)
{
if (head == nullptr) exit(0);
return head->length;
}
// 删除
bool DeleteHLinkListPos(HLinkList head, int pos)
{
if (head == nullptr) exit(0);
if (pos < 0 || pos >= Length(head))
return false;
HLinkList p = head;
while (pos)
{
pos--;
p = p->next;
}
HLinkList q = p->next;
p->next = q->next;
free(q);
head->length--;
return true;
}
bool DeleteHLinkListHead(HLinkList head)
{
return DeleteHLinkListPos(head, 0);
}
bool DeleteHLinkListRear(HLinkList head)
{
return DeleteHLinkListPos(head, Length(head) - 1);
}
bool DeleteHLinkListValue(HLinkList head, ElemType value)
{
if (head == nullptr) exit(0);
HLinkList p = head;
HLinkList q = p->next;
while (q != nullptr)
{
if (q->data == value)
{
p->next = q->next;
free(q);
}
else
{
p = q;
}
q = p->next;
}
}
// 判空
bool Empty(HLinkList head)
{
if (head == nullptr) exit(0);
//return head->length == 0;
return head->next == nullptr;
}