单链表的尾删、尾插、头插、头删、随机插、删的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DuckyLoser/article/details/79710814
seqlink.h
#include<stdio.h>

#pragma once


//单向链表
//双向链表
//

typedef char LinkNodeType; 

typedef struct LinkNode { 
LinkNodeType data; 
struct LinkNode* next; 
    //next = NULL 结束标志    不带环
    //next = 第一个节点位置   带环
    //
    //带头结点
    //不带头节点
} LinkNode; 

LinkNode* CreatNode(LinkNodeType value);//创造新节点

// 初始化链表 
void LinkListInit(LinkNode** node); 

void LinkListPrintChar(LinkNode* head,const char* msg);

void LinkListDestory(LinkNode** head );
//尾插一个元素到链表中 
void LinkListPushBack(LinkNode** head, LinkNodeType value); 

void LinkListPopBack(LinkNode** head);//尾删

void LinkListPushFrout(LinkNode** head,LinkNodeType value);//头插

void LinkListPopFourt(LinkNode** head);//头删

void LinkListInsert(LinkNode*pos,LinkNodeType value);
    //新节点插入在pos之后
void LinkListEarse(LinkNode** head,LinkNode* pos);//删除指定位置

LinkNode* LinkListFind(LinkNode* head,LinkNodeType value);//查找位置

void LinkListInsertBef(LinkNode** head,LinkNode* pos,LinkNodeType value);
//在pos之前插入元素

void LinkListDelVal(LinkNode** head,LinkNodeType value);//删除指定元素

void LinkListDelAll(LinkNode** head,LinkNodeType value);//删除相同元素

size_t LinkListSize(LinkNode* head);//元素个数


seqlink.c

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

LinkNode* CreatNode(LinkNodeType value)
{
    LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
    NewNode->data = value;
    NewNode->next = NULL;
    return NewNode;
}

void DestoryNode(LinkNode* node)
{
    free(node);
}

void LinkListInit(LinkNode** node)
{
    //if(node == NULL)
    //{
    //    //error
    //    printf("非法输入!\n");
    //    return;
    //}
    *node = NULL;
}

void LinkListDestory(LinkNode** head)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //空链表
        return;
    }
    LinkNode* cur = *head;
    while(*head)
    {
        cur = (*head)->next;
        DestoryNode(*head);
        *head = cur;
    }
    return;
}

void LinkListPushBack(LinkNode** head,LinkNodeType value)
{
    if(head == NULL)
    {
        //error
        printf("非法输入!\n");
        return;
    }
    if(*head == NULL)
    {
        //printf("空链表\n");
       *head =  CreatNode(value);
        return;
    }
    LinkNode* cur = *head;
    while(cur->next != NULL)
    {
        cur = cur->next;
    }
    LinkNode* NewNode = CreatNode(value);
    cur->next = NewNode;
   // NewNode->next = NULL;没必要    CreatNode中已经实现置空
    return;
}

void LinkListPrintChar(LinkNode* head,const char* msg)
{
    printf("[%s]\n",msg);
    LinkNode* cur = head;
    for(;cur != NULL;cur = cur->next)
    {
        printf("[%c|%p]\t",cur->data,cur);
    }
    printf("\n");
}

void LinkListPopBack(LinkNode** head)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //printf("空链表!\n");
        return;
    }
    if((*head)->next == NULL)
    {
        //只有一个元素 
        DestoryNode(*head);
        *head = NULL;
        return;
    }
    LinkNode* pre = NULL;
    LinkNode* cur = *head;
    while(cur->next != NULL)
    {
        pre = cur;
        cur = cur->next;
        //cur指向最后一个节点
        //pre指向倒数第二个节点
    }
    pre->next = NULL;
    DestoryNode(cur);
    return;
}

void LinkListPushFrout(LinkNode** head,LinkNodeType value)
{
    if(head == NULL)
    {
        //error
        return;
    }

    LinkNode* NewNode = CreatNode(value);
    NewNode->next = *head;
    *head = NewNode;
    return;
}

void LinkListPopFourt(LinkNode** head)
{
     if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //空链表
        return;
    }
    LinkNode* cur = *head;
    *head = (*head)->next;
    DestoryNode(cur);
    return;
}


void LinkListInsert(LinkNode*pos,LinkNodeType value)
{
    //if(head == NULL)
    //{
    //    //空链表
    //    return
    //}
    if(pos == NULL)
    {
        //error
        //pos表示节点指针  若为null 不存在节点
        return;
    }
    LinkNode* NewNode = CreatNode(value);
    NewNode->next = pos->next;
    pos->next = NewNode;
    return;
}

void LinkListEarse(LinkNode** head,LinkNode* pos)
{
    if(head == NULL || pos == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //空链表
        return;
    }
    LinkNode* cur = *head;
    for(;cur != NULL;cur= cur->next)
    {
        if(cur->next == pos)
        {
            break;
        }
    }
    //退出原因
    if(cur == NULL)
    {
        return;
    }
    cur->next = pos->next;
    DestoryNode(pos);
}

LinkNode* LinkListFind(LinkNode* head,LinkNodeType value)
{
    if(head == NULL)
    {
        //空链表
        return NULL;
    }
  //找到了返回节点对应的地址,若没有,返回NULL;
    LinkNode* cur = head;
    for(;cur!=NULL;cur=cur->next)
    {
        if(cur->data == value)
        {
            return cur;
        }
    }
    return NULL;
}
void LinkListInsertBef(LinkNode** head,LinkNode* pos,LinkNodeType value)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //空链表
        return;
    }
    if(pos == NULL)
    {
        return;
    }
    LinkNode* NewNode = CreatNode(value);
    NewNode->next = pos->next;
    pos->next = NewNode;
    NewNode->data = pos->data;
    pos->data = value;
    return;
}

void LinkListDelVal(LinkNode** head,LinkNodeType value)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //error
        return;
    }
    LinkNode* cur = *head;
    LinkNode* pos = LinkListFind(*head,value);
    for(;cur!=NULL;cur=cur->next)
    {
        if(cur->next->data == value)
        break;
    }
    if(cur == NULL)
    {
        return;
    }
    cur->next = pos->next;
    DestoryNode(pos);
}

void LinkListDelAll(LinkNode** head,LinkNodeType value)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(*head == NULL)
    {
        //error
        return;
    }
    LinkNode* cur = *head;
    while(cur != NULL)
    {
        while(cur->data == value)
        {
            cur = cur->next;
        }
        *head = cur;
        LinkNode* pos = *head;
        cur = cur->next;

        while(cur != NULL)
        {
            if(cur->data != value)
            {
                pos->next = cur;
                pos = pos->next;
            }
            cur = cur->next;
        }
        pos->next = NULL;
        pos = pos->next;
        DestoryNode(pos);
    }
    return;
}

size_t LinkListSize(LinkNode* head)
{
    if(head == NULL)
    {
        //空链表
        return 0;
    }
    LinkNode* pos = head;
    size_t count = 0;
    while(pos != NULL)
    {
        ++count;
        pos = pos->next;
    }
    return count;
}

//Test Code
/////////////////////////////////

void TestInit()
{
    LinkNode* head;
    LinkListInit(&head);
}

void TestPushBack()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head ,'a');
    LinkListPushBack(&head ,'b');
    LinkListPushBack(&head ,'c');
    LinkListPushBack(&head ,'d');
    LinkListPrintChar(head,"尾插");
}

void TestPopBack()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPopBack(&head);
    LinkListPrintChar(head,"空链表删除");

    LinkListPushBack(&head ,'a');
    LinkListPopBack(&head);
    LinkListPrintChar(head,"只有一个元素删除");

    LinkListPushBack(&head ,'b');
    LinkListPushBack(&head ,'c');
    LinkListPushBack(&head ,'d');
    LinkListPopBack(&head);
    LinkListPrintChar(head,"尾删1个元素");
}

void TestLinkListPushFrout()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushFrout(&head,'a');
    LinkListPushFrout(&head,'b');
    LinkListPushFrout(&head,'c');
    LinkListPushFrout(&head,'d');
    LinkListPrintChar(head,"头插元素");
}

void TestLinkListPopFrout()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPrintChar(head,"空链表头删");
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPopFourt(&head);
    LinkListPrintChar(head,"头删元素");
}

void TestInster()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkNode* pos = head->next;
    LinkListInsert(pos,'x');
    LinkListPrintChar(head,"b之后插入");
}

void TestEarse()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkNode* pos = head->next;
    LinkListEarse(&head,pos);
    LinkListPrintChar(head,"删除b位置的元素");
}

void TestFind()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPushBack(&head,'d');
    LinkNode* pos =  LinkListFind(head,'b');
    printf("pos except %p , actual %p\n",head->next,pos);
}

void TestInsterBef()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPushBack(&head,'d');
    LinkNode* pos = LinkListFind(head,'d');
    LinkListInsertBef(&head,pos,'x');
    LinkListPrintChar(head,"在d之前插入x");

}

void TestDelVal()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPushBack(&head,'d');
    LinkListDelVal(&head,'b');
    LinkListPrintChar(head,"删除元素b");
}

void TestDelAll()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'k');
    LinkListPushBack(&head,'k');
    LinkListPushBack(&head,'e');
    LinkListPushBack(&head,'t');
    LinkListDelAll(&head,'a');
    LinkListPrintChar(head,"删除所有a元素");

}

void TestSize()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPushBack(&head,'d');
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'a');
    size_t ret = LinkListSize(head);
    printf("size = %d\n",ret);
}

void TestDestoryLink()
{
    LinkNode* head;
    LinkListInit(&head);
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'b');
    LinkListPushBack(&head,'c');
    LinkListPushBack(&head,'d');
    LinkListPushBack(&head,'a');
    LinkListPushBack(&head,'a');
    LinkListDestory(&head);
    LinkListPrintChar(head,"销毁链表");
}

int main()
{
    TestInit();
    TestPushBack();
    TestPopBack();
    TestLinkListPushFrout();
    TestLinkListPopFrout();
    TestInster();
    TestEarse();
    TestFind();
    TestInsterBef();
    TestDelVal();
    TestDelAll();
    TestSize();
    TestDestoryLink();
    return 0;
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页