单向链表的节点结构以及部分函数的实现(带头结点)

1.链表节点的结构

typedef int ElemType;
typedef struct Node {
//用联合体是为了不浪费头节点的data域,用来记录长度. union { ElemType data;//数据
int length; }; struct Node* next; }HSNode,*HLinkList;

2.需要实现的部分函数

//初始化
void
InitHLinkList(HLinkList head); //插入 bool InsertHLinkListPos(HLinkList head,ElemType value,int pos);//按位置插入数据 bool InsertHLinkListHead(HLinkList head, ElemType value);//头插 bool InsertHLinkListRear(HLinkList head, ElemType value);//尾插 //删除 bool DeleteHLinkListPos(HLinkList head, int pos);//按位置删 bool DeleteHLinkListHead(HLinkList head);//删头 bool DeleteHLinkListRear(HLinkList head);//删尾 bool DeleteHLinkListValue(HLinkList head, ElemType Value);//按值删除 bool Empty(HLinkList head);//判空 int HLength(HLinkList head);//长度 void Show(HLinkList head);//打印 void DestoryHLinkList(HLinkList head); void Reverse(HLinkList head);//逆置 void Reverse2(HLinkList head);

3.具体实现

#include<stdio.h>
#include<stdlib.h>
#include"linklisthead.h"

static HLinkList ApplySpace(HLinkList head, ElemType value)
{
    HLinkList new_node = (HLinkList)malloc(sizeof(HSNode));
    if (nullptr == new_node)
    {
        return nullptr;
    }
    new_node->data = value;
    new_node->next = head;
    return new_node;
}

void InitHLinkList(HLinkList head)
{
    if (nullptr == head) exit(0);
    head->length = 0;
    head->next = nullptr;
}

//插入
bool InsertHLinkListPos(HLinkList head,ElemType value,int pos)
{
    if (nullptr == head) exit(0);
    if (pos < 0 || pos > head->length)
    {
        printf("Insert Fail: Pos Error !\n");
        exit(0);
    }
    HLinkList p = head;
    while (pos > 0)
    {
        p = p->next;
        pos--;
    }
    HLinkList new_node = ApplySpace(p->next, value);
    if (nullptr == new_node)
    {
        printf("Insert Fail: Apply Fail !\n");
        exit(0);
    }
    p->next = new_node;
    head->length++;//别忘l length += 1;
    return true;
}

bool InsertHLinkListHead(HLinkList head, ElemType value)
{
    return InsertHLinkListPos(head, value,0);
}

bool InsertHLinkListRear(HLinkList head, ElemType value)
{
    return InsertHLinkListPos(head, value, HLength(head));
}
//删除
bool DeleteHLinkListPos(HLinkList head, int pos)
{
    if (nullptr == head) exit(0);
    if (Empty(head))
    {
        printf("Delete Fail: HLinkList Empty !\n");
        exit(0);
    }
    if (pos < 0 || pos > HLength(head))
    {
        printf("Delete Fail: Pos Error !\n");
        exit(0);
    }
    HLinkList p = head;//带入一个节点进行判断;如 0 节点
    while (pos > 0)
    {
        p = p->next;
        pos--;
    }
    HLinkList q = p->next;
    p->next = q->next;
    free(q);
    //HLinkList tmp1 = head->next; //error
    //while (pos > 0)
    //{
    //    tmp1 = tmp1->next;
    //    pos--;
    //}
    //HLinkList tmp2 = tmp1;
    //tmp1->next= tmp2->next;
    //free(tmp2);
    head->length--;
    return true;
}

bool DeleteHLinkListHead(HLinkList head)
{
    return DeleteHLinkListPos(head, 0);
}

bool DeleteHLinkListRear(HLinkList head)
{
    return DeleteHLinkListPos(head, HLength(head)-1);
}

bool DeleteHLinkListValue(HLinkList head, ElemType value)//再看看
{
    if (nullptr == head) exit(0);
    if (Empty(head))
    {
        printf("Delete Fail: List Empty \n");
        exit(0);
    }
    HLinkList p = head;
    HLinkList q = p->next;
    while (q != nullptr)
    {
        if (q->data == value)
        {
            head->length--;
            p->next = q->next;
            free(q);
        }
        else
        {
            p = q;
        }
        q = p->next;
    }
    return true;
}

void DestoryHLinkList(HLinkList head)
{
    if (head == nullptr) exit(0);
    
    while (!Empty(head))
    {
        DeleteHLinkListHead(head);
    }
}

bool Empty(HLinkList head)
{
    return head->length == 0;
}

int HLength(HLinkList head)
{
    if (nullptr == head) return -1;
    return head->length;
}

void Show(HLinkList head)
{
    if (nullptr == head)
    {
        exit(0);
    }
    HLinkList p = head->next;
    while (p != nullptr)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void Reverse(HLinkList head)
{
    if (nullptr == head) exit(0);
    if (HLength(head) <= 1) exit(0);
    HLinkList p = head->next;
    HLinkList q = p->next;
    HLinkList s = nullptr;
    while (p != nullptr)
    {
        p->next = s;
        s = p;
        p = q;
        if (q != nullptr) q = q->next;
    }
    head->next = s;
}

void Reverse2(HLinkList head)//头插法
{
    if (nullptr == head) exit(0);
    if (HLength(head) <= 1) exit(0);
    HLinkList p = head->next;
    HLinkList q = nullptr;
    while (p != nullptr)
    {
        InsertHLinkListHead(q, p->data);
        p = p->next;
    }
}

ps:代码是运行过,才转移上来.可以直接复制(若需要).其中有什么不对的地方,望告知谢谢各位大佬.

 

posted @ 2021-05-05 10:30  Wz_qq_2***6  阅读(126)  评论(0)    收藏  举报