c语言链表各种操作

实现链表的数据查询, 计数,翻转,插入,删除,

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

typedef struct linknode                  // 定义结构体                 //typedef  简化创建的struct
{
    int data;
    struct linknode *pnext;
}node;

void init(node *phead, int data)             //初始化头结点  
{
    phead->pnext = NULL;
    phead->data = 0;
}

node *deletefirst(node*phead, int findata)       //删除找到的data
{
    node *p1=NULL,*p2=NULL;                  //双指针法
    p1 = phead;               //保存头结点
    while(p1 != NULL)
    {
        if(p1->data != findata)
        {
            p2 = p1;            //p2保存p1上一个位置
            p1 = p1->pnext;          //向前移动
        }
         else
           {
               break;
            }
    } 
    if(p1 != phead)        //不是头结点
    {
        p2->pnext = p1->pnext;            //跳过p1
        free(p1);              //删除p1
    }
    else
    {
        phead = phead->pnext;
        free(p1);        //头部删除
    }
    return phead;
}


//尾部添加数据
node *addback(node *phead , int data)        
{
    node *pnew = (node*)malloc(sizeof(node));            //创建结构体指针变量pnew   并动态分配内存
    pnew->data = data;
    pnew->pnext = NULL;                               //尾指针的pnext字段设置为null
    if(phead == NULL)
    {
        phead = pnew;                       //直接相连
    }
    else
    {
        node *ptemp = phead;   //备份头结点
        while(ptemp->pnext != NULL)
        {
            ptemp = ptemp->pnext;
        }
        ptemp->pnext = pnew;
    }
    return phead;
}

//    显示链表
void show(node *phead)
{
    if(phead == NULL)
    {
        return;
    }
    else
    {
        printf("%d, %p, %p\n",phead->data, phead, phead->pnext);
        show( phead->pnext );            //递归调用   全部显示
    }
}


void addhead(node **pphead, int data)                 //头部插入
{
    node *pnew = (node *)malloc(sizeof(node));
    pnew->data = data;
    pnew->pnext = NULL; //先赋值为null
    if(pphead == NULL)
    {
        *pphead = pnew;                //直接连接
    }
    else
    {
        pnew->pnext = *pphead;
        *pphead = pnew;
    }
}

//链表的啊反转  
node *revit(node *phead)
{
    if(phead == NULL || phead->pnext == NULL)
    {
        return;
    }
    else
    {
        node *pre = NULL;            //创建3个指针
        node *pcur = NULL;               //当前节点指针
        node *pext =  NULL;               //当前节点下一个节点指针

        pre = phead;                     //让pre为当前头结点
        pcur = phead->pnext;
        while(pcur != NULL)
        {
            pext = pcur->pnext;            //备份下一个节点
            pcur->pnext = pre;             //指针翻转

            pre = pcur;                    //前进
            pcur = pext;
        }
        phead->pnext = NULL;
        phead = pre;

    }
    return phead;
}
//查找数据
node *search(node*phead, int finddata)
{
    node *p;
    for(p = phead;p!=NULL;p=p->pnext)
    {
        if(p->data == finddata)
        {
            return p;         //返回找到地址

        }
    }
    return NULL;

}

//在链表中插入数据

node *insert(node*phead, int finddata, int newdata)
{
    node *pew;
    node *p1=NULL,*p2=NULL;                  //双指针法
    p1 = phead;               //保存头结点
    pew = (node *)malloc(sizeof(node));          //创建pew结构体指针  并动态分配内存
    pew->data = newdata;                            //吧新数据赋给pew的数据域
    pew->pnext = NULL;
    while(p1 != NULL)
    {
        if(p1->data != finddata)
        {
            p2 = p1;            //p2保存p1上一个位置
            p1 = p1->pnext;          //向前移动
        }
        else
        {
            break;
        }
     }


    if(phead==p1)
    {
        pew->pnext = phead;    //保存头结点
        phead = pew;       //头部插入
    }
    else
    {
        pew->pnext = p1;

        p2->pnext = pew;
    }

}
//获取当前链表的数量
int  getnum(node *phead)
{
    if(phead == NULL)
    {
        return 0;
    }
    else
    {
        return 1+ getnum(phead->pnext);      //向后传递参数
    }
}


//冒泡排序

void bubble(node *phead)
{
    node *p1,*p2;
    for(p1 = phead; p1!=NULL;p1 = p1->pnext)                 //用双for循环    双指针
    {
        for(p2 = phead; p2 != NULL; p2=p2->pnext)
        {
            if(p1->data>p2->data)             //判定大小
            {
                int temp;
                temp = p1->data;              //交换数据
                p1->data = p2->data;
                p2->data = temp;
            }

        }
    }
}
//bubble(phead);

void main()
{
    node *phead = NULL;
     //init(phead,0);
    phead=addback(phead, 11);
    phead=addback(phead, 12);
    phead=addback(phead, 13);
    phead=addback(phead, 14);
    phead=addback(phead, 15);
    show(phead);
    phead = revit(phead);
    printf("\n\n\n");
    //addhead(&phead, 20);
    //node *pfind = search(phead,13 );
    //pfind->data = 99;     //修改13
    /*phead = deletefirst(phead, 11);
    phead = deletefirst(phead, 12);*/
    printf("%d", getnum(phead));

    phead = insert(phead, 13,88);
    phead = insert(phead, 11,77);
    show(phead);
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值