C语言双链表框架搭建练习(三)

来源:互联网 发布:php程序设计读后感 编辑:程序博客网 时间:2024/06/06 08:53

我们继续实现双链表插入排序,即将双链表创建时进行排序操作,核心函数如下:

node* addsortdata(node*phead, datatype data){    node *newp = (node*)malloc(sizeof(node));    newp->data = data;    newp->pnext = NULL;    if (phead==NULL)    {        phead = newp;    }    else    {        node*p = phead;        while (p->pnext != NULL && p->pnext->data < newp->data)  //停留在小于目标位置的前一位        {            p = p->pnext;        }        /*newp->pnext = p->pnext;        p->pnext = newp;*/        if (p == phead && p->data > newp->data)      //因为要改变投节点,所以需要单独把头插列举出来        {            newp->pnext = phead;            phead = newp;        }        else   //其余的为尾插或者中插        {            newp->pnext = p->pnext;            p->pnext = newp;        }    }    showdata(phead);    return phead;}

调用:

void main4(){    node* link = NULL;    link = addsortdata(link, 20);    link = addsortdata(link, 0);    link = addsortdata(link, 21);    link = addsortdata(link, 3);    link = addsortdata(link, 56);    link = addsortdata(link, 7);    link = addsortdata(link, 1);    link = addsortdata(link, 32);    link = addsortdata(link, 5);    link = addsortdata(link, 6);    showdata(link);    system("pause");}

环状链表

环状链表即首尾相连,创建时的核心函数如下:

node *adddatacircel(node*phead, datatype data) // 尾部添加{    node *newp = (node*)malloc(sizeof(node));    newp->data = data;    newp->pnext = phead;    if (phead==NULL)    {        phead = newp;        newp->pnext = phead;    //在环状链表初始化的时候,要注意为空的指针的赋值    }    else    {        node *p = phead;        while (p->pnext != phead)        {            p = p->pnext;        }        p->pnext = newp;    }    return phead;}

相对应的显示函数会发生死循环,即在环状链表内找不到结束点,所以相匹配有对应的显示函数:

void showcircel(node*phead)    //打印{    node *p = phead;    while (p->pnext != phead)    {        printf("%d     ", p->data);        p = p->pnext;    }    printf("%d     \n", p->data);}

node* findcircle(node*phead, datatype data){    node*p = phead;    while (p->pnext != NULL&&p->pnext->data != data)    {        p = p->pnext;    }    if (p->pnext->data!=data)    {        return NULL;    }    else    {        return p;    }}

node* delcircle(node*phead, datatype data){    node*p = findcircle(phead, data);    if (p == NULL)    {        return phead;    }     else    {        p->pnext = p->pnext->pnext;        return p;    }}
1 0
原创粉丝点击