比特106-数据结构-链表

SList.h

#include <stdio.h>
typedef int SListDataType;

typedef struct SListNode
{
    SListDataType data;
    struct SListNode* next;
}SListNode;

void SlistPushBack(SListNode** pphead, SListDataType x);
void SlistPopBack(SListNode** pphead);
void SlistPushFront(SListNode** phead, SListDataType x);
void SlistPopFront(SListNode** pphead);
SListNode* SListFind(SListNode* phead, SListDataType x);
void SListInsertAfter(SListNode* pos, SListDataType x);
void SListPrint(SListNode* phead);   

 

 

SList.c

#pragma once
#include"SList.h"
#include<stdlib.h>
#include<assert.h>

SListNode* BuySListNode(SListDataType x)
{
    SListNode* newNode = (SListNode*)malloc(sizeof(SListDataType));
    if (newNode == NULL)
    {
        printf("申请节点失败!\n");
        exit(-1);
    }

    newNode->data = x;
    newNode->next = NULL;

    return newNode;
}

void SListPrint(SListNode* phead)
{
    SListNode* cur = phead;
    while (cur != NULL)
    {
        printf("%d", cur->data);
        cur = cur->next;
    }
}

void SlistPushBack(SListNode** pphead, SListDataType x)
{
    SListNode* newNode = BuySListNode(x);

    if(*pphead==NULL)
    {
        *pphead = newNode;
    }
    else
    {
        SListNode* tail = *pphead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }

        tail->next = newNode;

    }
}

void SListPopBack(SListNode** pphead)
{
    if (*pphead == NULL)
    {
        return;
    }
    else if ((*pphead)->next == NULL)
    {
        free(* pphead);
        *pphead = NULL;
    }
    else
    {
        SListNode* prev = NULL;
        SListNode* tail = *pphead;
        while (tail->next != NULL)
        {
            prev = tail;
            tail = tail->next;
        }
        free(tail);
        //tail=NULL;
        prev->next = NULL;
    }
}


void SlistPushFront(SListNode** pphead, SListDataType x)
{
    SListNode* newnode = BuySListNode(x);
    newnode->next = *pphead;
    *pphead = newnode; 
}

void SlistPopFront(SListNode** pphead)
{
    if(*pphead=NULL)
    {
        return;
    }
    else
    {
        SListNode* next = (*pphead)->next;
        free(*pphead);
        *pphead = (*pphead)->next;
    }
}


SListNode* SListFind(SListNode* phead, SListDataType x)
{
    SListNode* cur = phead;
    while (cur)
    {
        if (cur->data == x)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

void SListInsertAfter(SListNode* pos, SListDataType x)
{
    assert(pos);
    SListNode* newnode = BuySListNode(x);
    newnode->next=pos->next;
    pos->next = newnode;
}

 

 

test.c

#define _CRT_SECURE_NO_WARNINGS
#include "SList.h"

int main()
{
    SListNode* pList = NULL;

    SlistPushBack(&pList, 1);
    SlistPushBack(&pList, 2);
    SlistPushBack(&pList, 3);
    SlistPushBack(&pList, 4);

    SListPrint(pList);
    return 0;
}
 

 

 

 

 

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值