数据结构学习日记(二)

单链表是由头指针唯一确定, 因此单链表可以用头指针的名字来命名。

 

typedef struct Lnode{//声明结点的类型和指向结点的指针类型

  ElemType  data;  //结点的数据域

   struct Lnode * next;  //结点的指针域

}Lnode,*LinkList;      //LinkList为指向结构体Lnode的指针类型

 

 

 

 

结点只有一个指针域的链表,称为单链表或线性链表

结点有两个指针域的链表,称为双链表

线性表中数据元素(结点)在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻。

 

 

 

 

单链表的初始化(带头结点的单链表)

 

 [算法步骤]

(1)生成新结点作头结点,用头指针L指向头结点。

(2)将头结点的指针域置空。

算法描述

  Status lnitList L(LinkList &L){

    L = new LNode;//或L= (LinkList) malloc ( sizeof (LNode));

    L->next = NULL;

    return OK;

}

 

判断链表是否为空:

空表:链表中无元素称为空链表(头指针和头结点仍然在)

[算法思路]判断头结点指针域是否为空

int ListEmpty(LinkList L){//若L为空表,则返回1,否则返回0

  if(L->next)

    return 0;

  else

    return 1;

}

 

单链表的销毁:链表销毁后不存在

[算法思路]从头指针开始,依次释放所有结点

 

  如果用delete,前面要用new

如果替换成free(p),前面也应该替换成malloc()

 

[算法]销毁单链表L

Status DestroyList_L(LinkList &L){//销毁单链表L

  Lnode *p;//或LinkList p;

  while(L){

    p=L;

    L=L->next;

    delete p;

}

  return OK;

}

 

清空链表:

链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)

[算法思路]依次释放所有结点,并将头结点指针域设置为空

 

 [算法]清空链表L:

Status ClearList(LinkList &L){//将L重置为空表

  Lnode *p,*q;//或LinkList p,q;

  p = L->next;

  while(p){    //没到表尾

    q=p->next;

    delete p;

    p = q;

    }

  L->next = NULL;  //头结点指针域为空

  return OK;

}

 

求单链表的表长:

[算法思路]从首元结点开始,依次计数所有结点

 

 [算法]求单链表L的表长

int ListLength_L(LinkList L){//返回L中数据元素的个数

  LinkList p;

  p = l->next;//p指向第一个结点

  i=0;

while(p){   //遍历单链表,统计结点数

  i++;

  p=p->next;

}

  return i;

}

 

 

 

 

 

 

 

 

 

 

posted @ 2021-09-01 20:18  aaawfss  阅读(79)  评论(0)    收藏  举报