zoukankan      html  css  js  c++  java
  • 数据结构--单链表

    单链表的特点

    1.用一组 任意的存储单元存储线性表中的数据元素,这组存储单元 可以是连续的,也可以是不连续的
    2.链表中结点的逻辑次序和物理次序 不一定相同,为了能正确反映结点间的逻辑关系,在存储每个结点值的同时,还 必须存储其后继结点的地址信息。(因为物理顺序不同,所以在每个存储的数据后面留出一小块空间存储下一个逻辑结点的地址)
    3.存放数据元素的结点至少包括两个域,一个域放该元素的数据,称为 数据域(data),另一个域存放后继结点在存储器中的地址,称为 指针域链域(next),这种链式分配的存储结构称为 链表

    左面数据域,右面指针域
          data             next


    如果一个结点只有一个指针域,称为 单链表(Single Linked List)
    如果一个节点有两个指针域,除了数据域后面的指向后继结点的指针域外,在数据域前面还有一个指向前趋结点的指针域,则称为 双链表

    在单链表的一个结点之前增加一个结点(头结点)称为带头结点的链表,此头结点的数据域不用。


    struct ListNode          //定义链表中的结点
    {
        DataType data;
        ListNode* next;
    };
    typedef ListNode* LinkList;          //给ListNode*起别名为LinkList 
    //初始化
    void InitList(LinkList* _pHead)
    {
        *_pHead=NULL;
    }
    //求表长
    int ListLength(LinkList li)
    {
        int nLength=0;
        while(li!=NULL)
        {
            li=li->next;
            nLength++;
        }
        return nLength;
    }
    //取链表L中的第i个结点
    LinkList GetNode(LinkList pList,int i)
    {

        if(i<0)
            return NULL;
        for (int j=0;j<i;j++)
            pList=pList->next;
        return pList;
    }
    // 查找结点
    int LocateNode( LinkList li, DataType x)
    {
        int nPoint=0;
        while (li&&li->data!=x)
        {
            li=li->next;
            nPoint++;
        }
        if(li)
            return nPoint;
        else
            return -1;
    }
    //插入结点
    void InsertList(LinkList *_pL,DataType _x,int _i)  //包括两种,头指针为空和插入0前面
    {
    LinkList temp=(ListNode*)malloc(sizeof(ListNode));
    temp->data=_x;
    int nLen=ListLength(*_pL);
    LinkList p;
    if(_i>=nLen)
    p=GetNode(*_pL,nLen-1);
    else
    p=GetNode(*_pL,_i-1);

    if(0>=_i||NULL==*_pL)
    {
    temp->next=*_pL;
    *_pL=temp;
    return true;
    }
    else  //两个结点中间插入和插入最后一个位置
    {
    ` temp->next=p->next;
    p->next=temp;
    }

    }
    //删除结点
    bool DeleteList(LinkList* _pL,int i)
    {
    LinkList  pNode=NULL;
    ListNode* p=NULL;
    if(i<0||i>ListLength(*_pL)-1)
    return false;
    if(0==i)
    {
    p=*_pL;
    *_pL=(*_pL)->next;
    }
    else
    {
    pNode=GetNode(*_pL,i-1);
    p=pNode->next;
    pNode->next=p->next;
    }
    free(p);
    p=NULL;
    return true;
     
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        LinkList pHead;  //LinkList类型的指针变量pHead表示它是单链表的头指针指向链表的第一个结点
        LinkList pNode; //定义一个指向结点的指针当最后一个结点没有后继结点因此把最后的指针设为空

         InitList(&pHead);

        _getch();
        return 0;
    }
  • 相关阅读:
    [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
    [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
    [译]:Xamarin.Android开发入门——Hello,Android深入理解
    [译]:Xamarin.Android开发入门——Hello,Android快速上手
    [译]:Orchard入门——使用标签管理内容
    [译]:Orchard入门——部件管理
    swift UITableView cell自适应高度
    设置Launch Image 启动图片(Xcode7)
    APNs 远程推送
    KVO (Key-Value-Observer, 键值观察)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3304065.html
Copyright © 2011-2022 走看看