线性表——单链表

来源:互联网 发布:大话数据库 知乎 编辑:程序博客网 时间:2024/06/14 02:43

单链表的特点

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

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


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

为了操作方便,一般在单链表的第一个节点之前增加一个节点,称之为头结点。头结点的数据域,可以不保存任何信息。指针域保存第一个节点的指针。
单链表的最后一个节点的指针为空,用"^"表示。如果头结点的指针域为空,则表表示一个空的单链表。





#include <stdio.h>

#include <stdlib.h>

typedefchar DataType;



struct ListNode//定义键表中的结点

{

   DataType data;//结点

    structListNode *next;//指向后继结点的地址。结构体本身的指针。

};

typedefstructListNode *LinkList;//给结构的指针起别名。





void init(LinkList *s);

int ListLength(LinkList li);

LinkList GetNode(LinkList g,int i);


int main(int argc,constchar * argv[])

{

    

   LinkList pHead =NULL;//表示它是单链表的头指针。

    //等效于。 struct LIstNode *pHead

    

    //LinkList pNode ;//定义一个指向结点的指针。

    //等效于。struct ListNode *pnode;

   init(&pHead);

   int leng=ListLength(pHead);

   printf("%d\n",leng);

    

   return0;

}


void init(LinkList *s)//初始化。

{

    *s=NULL;

}


int ListLength(LinkList li)//求表长。

{

   int nLength=0;

   while(li!=NULL)

    {

        

        li=li->next;

        nLength++;

        

    }

   return nLength;

}


LinkList GetNode(LinkList g,int i)//i的结点。

{

   int j=0;

   for (; g&&j<i; j++)

    {

        g=g->next;

    }

   if (j<i)

    {

       return g;

    }

    

    returnNULL;

    

    

}


LinkList Locate(LinkList l,DataType x)//查找元素的位置;

{

   while (l)

    {

       if (l->data==x)

        {

           return l;

        }

        

        l=l->next;

    }

    returnNULL;

    

}

void Insertlist(LinkList *p,DataType x,int i)//插入节点

{

   //生成存储数据的新节点。

   LinkList pNode=NULL;

    pNode=(LinkList)malloc(sizeof(LinkList));

    pNode->data=x;

    pNode->next=NULL;

   int ListLen=ListLength(*p)-1;

    

    if (i<=0)//插入在第一个节点前面。

    {

        pNode->next=*p;

        *p=pNode;

        

    }

   elseif (i>ListLen)//插入在最后一个节点的后面。

    {

       GetNode(*p, ListLen)->next=pNode;

    }

    

    else//插入在节点的中间。

    {

       LinkList p1=GetNode(*p, i-1);

        pNode->next=p1->next;

        p1->next=pNode;

    }

    

   free(pNode);

  

}

void Delete(LinkList *p,int n)//删除节点。

{

    

   LinkList p2=NULL;

    

   if (n==0)

    {

        p2=*p;

        *p=(*p)->next;

    }

        

   else

    {

       

       LinkList P1=GetNode(*p, n-1);

        p2=P1->next;

        P1->next=p2->next;

       free(p2);

    }

    

    

    

}



原创粉丝点击