随感而发

杂七杂八

统计

留言簿(13)

阅读排行榜

评论排行榜

链表学习--双向链表实现

今天学习了链表的数据结构。他的主要思路为:
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;
}

posted on 2009-04-30 20:25 shongbee2 阅读(6032) 评论(2)  编辑 收藏 引用 所属分类: 数据结构和算法

评论

# re: 链表学习--双向链表实现 2009-04-30 20:28 shongbee2

这里因为排版有问题,加上我技术很烂,所以图很模糊,不要见怪啊。是书上的原图。呵呵。。。  回复  更多评论   

# re: 链表学习--双向链表实现 2013-04-16 15:20 苏七七

觉得你对双链表的理解上有问题。。。。@shongbee2
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理