单向链表操作

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

typedef struct node 
{
    int data;
    struct node *pnext;
}linknode;
// 头节点不存储值,仅next指向
linknode *createlinklist(void)
{
    // 创建链表,分配空间,1个node 作为头节点
    linknode *ptmpnode = NULL;
    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return NULL;
    }

    ptmpnode->pnext = NULL;

    return ptmpnode;
}
// 头插入,每次插入的值都在头节点之后
int insertheadlinklist(linknode *phead, int tmpdata)
{
    // 插入节点
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }
        
    ptmpnode->data = tmpdata;
    ptmpnode->pnext = phead->pnext;// 将头节点的next指向新的节点的next指向
                                        // 新的节点插在头节点之后,头插入,连接之前插入的数据
    phead->pnext = ptmpnode;  // 头节点指向新的节点

    return 0;
}

int showlinklist(linknode *phead)
{
    linknode *ptmp = NULL;

    ptmp = phead->pnext;
    while (ptmp != NULL)
    {
        printf("%d ", ptmp->data);
        ptmp = ptmp->pnext;
    }
    printf("\n");

    return 0;
}
linknode *findlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        if (ptmpnode->data == tmpdata)
        {
            return ptmpnode;
        }
        ptmpnode = ptmpnode->pnext;
    }
    
    return NULL;
}

int replacelinklist(linknode *phead, int oldata, int newdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        if (ptmpnode->data == oldata)
        {
            ptmpnode->data = newdata;
        }
        ptmpnode = ptmpnode->pnext;
    }
    return 0;
}
// 尾部插入,尾插法
int inserttaillinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *plastnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = NULL;

    plastnode = phead;// 头节点不能变
    while (plastnode->pnext != NULL)
    {
        plastnode = plastnode->pnext;
    }
    plastnode->pnext = ptmpnode;

    return 0;
}

int deletelinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *pprenode = NULL;

    pprenode = phead;
    ptmpnode = phead->pnext;

    while (ptmpnode != NULL)
    {
        if (ptmpnode->data == tmpdata)
        {      // 找到位置删除
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;//后移继续遍历
        }
        else 
        {
            ptmpnode = ptmpnode->pnext;
            pprenode = pprenode->pnext;
        }
    }

    return 0;
}
//  二级指针 修改指针的值,一级指针修改地址
int destroylinklist(linknode **pphead)
{
    linknode *ptmpnode = NULL;
    linknode *pfreenode = NULL;

    ptmpnode = pfreenode = *pphead;
    while (ptmpnode != NULL)
    {
        ptmpnode = ptmpnode->pnext;
        free(pfreenode);
        pfreenode = ptmpnode;
    }
    *pphead = NULL;

    return 0;
}

int bubblesortlinklist(linknode *phead)
{
    linknode *ptmpnode1 = NULL;
    linknode *ptmpnode2 = NULL;
    linknode *pend = NULL;
    int tmp = 0;

    while (1)
    {
        ptmpnode1 = phead->pnext;
        ptmpnode2 = phead->pnext->pnext;
        
        if (ptmpnode2 == pend)
        {
            break;
        }

        while (ptmpnode2 != pend)
        {
            if (ptmpnode1->data > ptmpnode2->data)
            {
                tmp = ptmpnode1->data;
                ptmpnode1->data = ptmpnode2->data;
                ptmpnode2->data = tmp;
            }

            ptmpnode1 = ptmpnode1->pnext;
            ptmpnode2 = ptmpnode2->pnext;
        }

        pend = ptmpnode1;
    }
    return 0;
}

int selectsortlinklist(linknode *phead)
{
    linknode *pselectnode = NULL;
    linknode *pminnode = NULL;
    linknode *ptmpnode = NULL;
    int tmp;
    
    pselectnode = phead->pnext;
    while (pselectnode->pnext != NULL)
    {
        pminnode = pselectnode;
        ptmpnode = pselectnode->pnext;
        while (ptmpnode != NULL)
        {
            if (ptmpnode->data < pminnode->data)
            {
                pminnode = ptmpnode;
            }

            ptmpnode = ptmpnode->pnext;
        }
        if (pminnode != pselectnode)
        {
            tmp = pminnode->data;
            pminnode->data = pselectnode->data;
            pselectnode->data = tmp;
        }

        pselectnode = pselectnode->pnext;
    }

    return 0;
}
void reverselinklist(linknode *phead)
{
    
    linknode *ptmpnode = NULL;
    linknode *ptmpnode1 = NULL;

     // 将链表分为两个,第一个链表两个节点,分别是头尾,第二个链表逐个插入
    ptmpnode = phead->pnext->pnext;
   
    phead->pnext->pnext = NULL;


     while(ptmpnode != NULL)
    {
     // 取出当前节点,后移
        ptmpnode1 = ptmpnode;
        ptmpnode = ptmpnode->pnext;

     // 当前节点插入正确位置
        ptmpnode1->pnext = phead->pnext;
        phead->pnext = ptmpnode1;
    }
}
int main(void)
{
    linknode *plinklist = NULL;
    linknode *ptmpnode = NULL;

    plinklist = createlinklist();

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值