双向链表

    技术2022-05-20  73

    1. 他访问数据的方式不是数组的下标,而是他的节点的指针来访问。所以他可以更灵活的处理数据见得相关信息。不过他的速度肯定没有数组下标快的,空间也没有数组利用率高,可他的灵活性给了我们很大的方便。我们用链表的时候还是很多的。2. 链表是用指针的指向来访问管理数据的,一个我们把数据存在一个节点里,一个节点包括:nData,节点的数据域,nNext,他指向的下一个指针,nPre他的上一个指针。如果他没有下一个指针或上一个指针,我们指向空nil.3. 一般一个链表有一个头节点。以他开始访问整个链表区域的数据。这样我们就能更好的控制链表了,就像数组下标为0的元素一样。A[0]的地位。截取书上的图:

    这就是一个链表的样子了。呵呵 是不是很直观呢?链表主要的操作包括:插入,删除,查找,清空,等主要操作。很重要的数据结构,奉上源代码:

    #include  < stdio.h > #include  < stdlib.h > // 定义链表的结构体。 struct  MyList {    int nData;    MyList* pPre;    MyList* pNext;} ; // 全局的变量,保存链表的头 MyList *  g_pHead  =  NULL; // 判断链表是否为空 bool  IsEmpty() {    //如果头指针指向的是空,链表为空    return g_pHead == NULL;} // 清空链表 int  Clear() {    //删除所有数据,并把头指针指向为空    MyList* pTemp = g_pHead;    //遍历链表的数据。如果有数据,删除,然后进入下一个数据    while(g_pHead)    {        g_pHead = g_pHead->pNext;        delete pTemp;        pTemp = g_pHead;    }    return 1;} // 插入数据到链表中 int  Insert( int  nData) {    //这里是插入到头的位置,类似栈的操作。    MyList* pTemp = new MyList();    //申请一个新的空间存放数据。    pTemp->nData = nData;    pTemp->pPre = NULL;            //他的上一个没有    pTemp->pNext = g_pHead;        //他的next指向头节点,他作为头节点的上一个成为新头节点    if (g_pHead)    {        g_pHead->pPre = pTemp;    //如果头节点有数据,则把头节点的上一个指向该节点。    }    g_pHead = pTemp;            //是头节点指针指向他,他成为新的头节点    return 1;} // 查找数据 bool  Find( int  nData) {    MyList* pTemp = g_pHead;        //从头节点开始寻找。    //遍历数据    while(pTemp)    {        if (pTemp->nData == nData)    //如果找到该数据,        {            return true;            //返回真。        }        pTemp = pTemp->pNext;        //没有找到,进入下一个节点    }    return false;            //遍历之后没有找到,则没有该数据,返回false} // 删除数据。 bool  Delete( int  nData) {    //先找到数据,然后再删除。    MyList* pTemp = g_pHead;    //要删除的节点指针。        //遍历链表找到要删除的节点    while (pTemp)            {        if (pTemp->nData == nData)    //找到了,删除它        {            if (pTemp->pPre)    //如果他有前一个节点,则前一个节点的next指向他的下一个节点            {                    //这样就不会吊链了。                pTemp->pPre->pNext = pTemp->pNext;            }            else        //没有上一个节点,则他就是头节点。            {                g_pHead = pTemp->pNext;    //头节点指针指向他,他就可以安息了。            }            if (pTemp->pNext)    //处理他的下一个节点情况,和上节点类似            {                pTemp->pNext->pPre = pTemp->pPre;            }            delete pTemp;    //删除它的数据空间            return true;    //返回true,删除成功        }    }    return false;    //没有找到数据,删除失败,返回false} int  main() {    //测试,    for (int i = 0; i < 10++i)    {        Insert(i);    //插入数据    }    if (Find(5)) //查找数据    {        printf("Yes!/n");    }    if (!Find(11))    {        printf("No!/n");    }    while(!IsEmpty())    //逐一删除数据    {        printf("%d ", g_pHead->nData);        Delete(g_pHead->nData);    }    printf("/n");    for (int i = 0; i < 10++i)    {        Insert(i);    }    Clear();        //清空数据。    if (IsEmpty())    {        printf("Empty!/n");    }    system("pause");    return 0;}

    最新回复(0)