c语言链表各种操作

来源:互联网 发布:档案软件 编辑:程序博客网 时间:2024/05/18 03:04

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

#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");}
原创粉丝点击