无头单链表的操作(基于前面的修改版)

slist.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int DataType;
typedef struct SlistNode
{
    struct SlistNode *_next;
    DataType _data;
}SlistNode;

SlistNode* BuySlistNode(DataType data); //创建节点
void PrintSlist(SlistNode *pHead); //打印链表
void InitSlist(SlistNode **ppHead); //初始化链表
SlistNode* FindNode(SlistNode **ppHead, DataType data); //寻找节点

void PushBackSlist(SlistNode **ppHead, DataType data); //尾插
void PushFrontSlist(SlistNode **ppHead); //尾删

void PopBackSlist(SlistNode **ppHead, DataType data); //头插
void PopFrontSlist(SlistNode **ppHead); //头删

void PrevInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data); //任意位置插入,插在前
void TailInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data);  //任意位置插入,插在后
void ErasePosSlist(SlistNode **ppHead, SlistNode *pos); //任意位置删除

void DestroySlist(SlistNode **ppHead);  //销毁链表
int CountSlist(SlistNode *pHead);  //计算链表的节点个数

slist.c

#include"slist.h"

SlistNode* BuySlistNode(DataType data) //创建节点
{
    SlistNode *head = (SlistNode*)malloc(sizeof(SlistNode)*sizeof(DataType));
    if (head)
    {
        head->_data = data;
        head->_next = NULL;
        return head;
    }
    return NULL;    
}

void InitSlist(SlistNode **ppHead) //初始化链表
{
    SlistNode *cur;
    assert(ppHead);
    cur = *ppHead;
    while (cur)
    {
        cur->_data = 0;
        cur = cur->_next;
    }
}

void PrintSlist(SlistNode *pHead) //打印链表
{
    while (pHead) //空链表也打印了
    {
        printf("%d--> ", pHead->_data);
        pHead = pHead->_next;
    }
    printf("NULL\n");
}

SlistNode* FindNode(SlistNode **ppHead, DataType data) //寻找节点
{
    SlistNode *find = NULL;
    assert(ppHead);
    find = *ppHead;
    while (find)
    {
        if (find->_data == data)
            return find;
        find = find->_next;
    }
    return NULL;
}

void PushBackSlist(SlistNode **ppHead, DataType data) //尾插
{
    SlistNode *tail = NULL;
    assert(ppHead);
    if (*ppHead == NULL) //没有节点
    {
        *ppHead = BuySlistNode(data);
    }   
    else
    { 
        tail = *ppHead;
        while (tail->_next)//一个或多个节点
        {
            tail = tail->_next;
        }
        tail->_next = BuySlistNode(data);
    }
    }


void PushFrontSlist(SlistNode **ppHead) //尾删
{
    SlistNode *del = NULL;
    SlistNode *prev = NULL;
    assert(ppHead);
    if (NULL == *ppHead)
        return;
    del = *ppHead;
    del = del->_next;
    while (del->_next)
    {
        prev = del;
        del = del->_next;
    }
    prev->_next = del->_next;    //prev->_next = NULL
    free(del);
}

void PopBackSlist(SlistNode **ppHead, DataType data) //头插
{
    SlistNode *newnode = NULL;
    assert(ppHead);
    if (NULL == *ppHead)
        *ppHead = BuySlistNode(data);
    else
    {
        newnode = BuySlistNode(data);
        newnode->_next = *ppHead;
        *ppHead = newnode;
    }
}

void PopFrontSlist(SlistNode **ppHead) //头删
{
    assert(ppHead);
    if (NULL == *ppHead)
        printf("链表为空\n");
    else
        *ppHead = (*ppHead)->_next;
}

void PrevInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data) //任意位置插入,插在前面
{
    SlistNode *cur = NULL;
    assert(ppHead);
    assert(pos);
    if (pos == *ppHead)   //在头部
    {
        cur = BuySlistNode(data);
        cur->_next = pos;
        *ppHead = cur;
    }
    else
    {
        cur = pos;
        pos = BuySlistNode(pos->_data);  //替换法插入
        pos->_next = cur->_next;
        cur->_next = pos;
        cur->_data = data;
    }
}

void TailInsertPosSlist(SlistNode **ppHead, SlistNode *pos, DataType data)  //插到后面
{
    SlistNode *newnode = NULL;
    assert(pos);
    assert(ppHead);
    if (NULL == *ppHead)
    {
        printf("链表为空\n");
    }
    else
    {
        newnode = BuySlistNode(data);
        newnode->_next = pos->_next;
        pos->_next = newnode;
    }

}

void ErasePosSlist(SlistNode **ppHead, SlistNode *pos) //任意位置删除, 删pos后的下一个节点
{
    SlistNode *cur = NULL;
    assert(ppHead);
    if (*ppHead == NULL)
        printf("链表为空\n");
    else 
    {
        if (pos == *ppHead)
        {
            *ppHead = pos->_next;
            free(pos);
        }
        else
        {
            cur = *ppHead;
            while (cur && (cur->_next != pos))
            {
                cur = cur->_next;
            }
            if(NULL == cur) //防止当前链表中没有pos这个节点
            {
                printf("当前链表没有pos这个节点\n");
            }
            else
            {
                cur->_next = pos->_next;
                free(pos);
            }
        }
    }   
}

void DestroySlist(SlistNode **ppHead)  //销毁链表,前后指针法
{
    SlistNode *del = NULL;
    assert(ppHead);
    del = *ppHead;
    while (*ppHead)
    {
        *ppHead = (*ppHead)->_next;
        free(del);
        del = *ppHead;
    }
    free(*ppHead);
}

int CountSlist(SlistNode *pHead)  //计算链表的节点个数
{
    //assert(pHead);
    int count = 0;
    while (pHead)
    {
        ++count;
        pHead = pHead->_next;
    }
    return count;
}

test.c

#include"slist.h"

//测初始化,尾插,尾删
//test1()
//{
//  SlistNode *list = NULL;
//  InitSlist(&list);
//  PrintSlist(list);
//  
//  PrintSlist(list);
//  PushBackSlist(&list, 1);
//  PushBackSlist(&list, 2);
//  PushBackSlist(&list, 3);
//  PushBackSlist(&list, 4);
//  PushBackSlist(&list, 5);
//  PushBackSlist(&list, 6);
//  /*PrintSlist(list);
//  InitSlist(&list);
//  PrintSlist(list);*/
//  
//  PushFrontSlist(&list);
//  PushFrontSlist(&list);
//  PrintSlist(list);
//}

//测试头插,头删
//test2()
//{
//  SlistNode *list = NULL;
//  PopBackSlist(&list, 1);
//  //PopBackSlist(&list, 2);
//  //PopBackSlist(&list, 3);
//  //PopBackSlist(&list, 4);
//  //PopBackSlist(&list, 5);
//  //PopBackSlist(&list, 6);
//  //PopBackSlist(&list, 7);
//  PrintSlist(list);
//  
//  PopFrontSlist(&list);
//  PopFrontSlist(&list);
//  //PopFrontSlist(&list);
//  //PopFrontSlist(&list);
//  PrintSlist(list);
//}

//测试任意位置删除和插入,销毁,计算个数
test3()
{
    SlistNode *list = NULL; 
    SlistNode *pos = NULL;

    PushBackSlist(&list, 1);
    PushBackSlist(&list, 2);
    PushBackSlist(&list, 3);
    PushBackSlist(&list, 4);
    PushBackSlist(&list, 5);
    PushBackSlist(&list, 6);
    PrintSlist(list);

    printf("%d\n",CountSlist(list));

    /*pos = FindNode(&list, 1);*/
    //PrevInsertPosSlist(&list, pos, 8);
    //PrintSlist(list);
    //TailInsertPosSlist(&list, pos,7);
    //PrintSlist(list);
    //ErasePosSlist(&list, pos);
    //PrintSlist(list);

    //ErasePosSlist(&list, pos);
    PushFrontSlist(&list);
    PopFrontSlist(&list);

    printf("%d\n", CountSlist(list));
    PrintSlist(list);
    DestroySlist(&list);
    PrintSlist(list);
    printf("%d\n", CountSlist(list));
}

int main()
{
    //test1();
    //test2();
    test3();
    system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值