单向链表循环

来源:互联网 发布:古龙笔下高手知乎 编辑:程序博客网 时间:2024/05/21 18:42
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <malloc.h>#include<assert.h>typedef struct LoopLink{    int nValue;    struct LoopLink *pNext;}LoopLink, *PLoopLink;                           //设置结点对象,包含两个成员,nvalue和指向下一个对象的指针pNExtPLoopLink Create(){    PLoopLink pHead = (PLoopLink)malloc(sizeof(LoopLink));        //为表头分配空间,用于存储表头    if (NULL == pHead)    {        printf("分配内存失败!\n");    }    pHead->nValue = -9999;    pHead->pNext = pHead;                                             //为表头中的数据成员进行赋值,,,nvalue,,和pnext指针    return pHead;                                           //返回 表头给创建的对象}void Insert(PLoopLink pHead, int nValue){    if (NULL == pHead)    {        printf("链表未创建成功!\n");        return ;    }                                              //查看表头是否创建,    PLoopLink pCur = pHead;    PLoopLink pTmp = (PLoopLink)malloc(sizeof(LoopLink));     //为插入的值(对象)开辟一个存储空间,用于存储nvalue和pnext指针    pTmp->nValue = nValue;          //为插入的对象的数据成员进行赋值    pTmp->pNext = NULL;    while (pCur->pNext != pHead)    {        if (pCur->pNext->nValue > nValue)        {            break;        }        pCur = pCur->pNext;    }    pTmp->pNext = pCur->pNext;    pCur->pNext = pTmp;         //插入操作,因为是按从小到大进行插值的,插入的对象的[nex指针指向的是大值得指针,}void Delete(PLoopLink pHead, int nValue){    if (pHead == NULL)    {        printf("链表未创建成功!\n");        return;    }    PLoopLink pCur = pHead;    while (pCur->pNext!= pHead)    {        if (pCur->pNext->nValue == nValue)        {            PLoopLink pTmp = pCur->pNext;            pCur->pNext = pTmp->pNext;            free(pTmp);                //释放存储空间            pTmp = NULL;                 //表示该处没有内存存储数据        }        else        {            pCur = pCur->pNext;        }    }}PLoopLink Find(PLoopLink pHead, int nValue){    if (pHead == NULL)    {        printf("链表未创建成功!\n");        return NULL;    }    PLoopLink pCur = pHead;                        //首先,得到链表的首地址,进行查找    while (pCur->pNext!= pHead)                   //退出循环的条件是最后的对象的pnext指向表头,代表了循环到头    {        if (pCur->pNext->nValue == nValue)        //判断对象的值是不是等于查找的值        {            return pCur->pNext;                   //如果是返回该处的地址        }        else        {            pCur = pCur->pNext;                   //如果不是,则进行下一个对象的查找              }    }    return NULL;                                //都没有的话,返回NULL}bool IsEmpty(PLoopLink pHead){    if (NULL == pHead)    {        printf("链表未创建成功!\n");    }    return pHead->pNext == pHead;}void Print(PLoopLink pHead){    if (pHead == NULL)    {        printf("链表未创建成功!\n");        return;    }    if (pHead->pNext == pHead)    {        printf("链表为空!\n");        return;    }                                     //循环结束的条件,对象的pnext指向表头    PLoopLink pCur = pHead->pNext;    while (pCur != pHead)    {        printf("%d ", pCur->nValue);        pCur = pCur->pNext;    }    printf("\n");}int main(){    PLoopLink pHead = Create();                     //链表的建立,主要是建立链表的表头,为表头开辟空间   // printf("%d\n", IsEmpty(pHead));    Insert(pHead, 1);                              //插值操作,主要是指在表头后面,插入另一个对象,该对象的nvalue是输入的值    Insert(pHead, 5);     Insert(pHead, 8);    Insert(pHead, 4);    Insert(pHead, 0);    if (NULL != Find(pHead, 2))             //在链表中查找数值,一以链表的起始地址开始查找nvalue的值,用指针指向下一个对象,循环进行查找    {        printf("链表中有该数据!\n");    }    else    {         printf("链表中没有该数据!\n");    }        Delete(pHead, 8);            //删除某一元素,就是让该对象的上一个对象指向该对象的下一个对象,同时把该对象的存储空间释放    Print(pHead);              //打印链表中的数据,首先从表头开始,然后指向下一个对象输出值,然后指向下一个对象输出。。。。。    system("pause");    return 0;}

0 0
原创粉丝点击