数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)

1.单链表(带头结点)的初始化
即,构造一个空表,如下图,
在这里插入图片描述

  • 算法步骤
    • 1.生成新结点作头结点,用头指针L指向头结点。
    • 2.将头指针的指针域置空。
  • 算法描述
Status InitList_L(LinkList& L)
{
   L = new LNode;  //在C语言里,为 L=(LinkList)malloc(sizeof(LNode));
   L->next = NULL;
   return OK;
}

2.判断链表是否为空

空表:链表中无元素,但头指针和头结点仍然在。
在这里插入图片描述

  • 算法思路:判断头结点的指针域是否为空。
  • 算法描述
int ListEmpty(LinkList L)    //若L为空表,则返回1,否则返回0
{                          
   if (L->next)            //非空
   	return 0;
   else
   	return 1;
}

3.单链表的销毁

销毁单链表:在内存中删除,链表销毁后,其头指针和头结点也不会存在。

  • 算法思路:从头节点开始,依次释放所有结点
    怎么能让一个指针p指向变量a?
           做法就是把a的地址赋给指针变量p,即p=&a。这样就定义了一个指向a的指针p。

    1.先定义一个指针p,指向当前结点(一开始,p是指向头结点的指针),即,p=L 在这里插入图片描述
    2.让L指向下一个结点,即,L=L->next,在这里插入图片描述
    3.删除当前结点p,即,delete p
    4.回到第一步。
    5.结束条件为:L=NULL
      (循环条件为:L!=NULLL)
  • 算法描述
Status DestroyList_L(LinkList& L)   //销毁单链表L
{
   Lnode* p;           //或LinkList p;
   while (L) 
   {
   	p = L;          //指向当前结点(一开始指向的是头节点)
   	L = L->next;    //使L指向下一结点
   	delete p;       //删除当前结点
   }
}

4.清空单链表

清空单链表:链表在内存中仍然存在(头指针和头结点仍然在),但链表中无元素。

  • 算法思路:依次释放所有结点,并将头结点指针域设置为空
    怎么能让指针p指向首元结点?
    p=L;                //p指向头结点
    p=L->next;          //p指向首元结点
    
    1.先定义一个指针p,指向当前结点(一开始,p是指向首元结点的指针),即,p=L->next在这里插入图片描述
    2.在释放当前结点p之前,要先确定好下一结点的位置。所以需要再定义一个指针q,让其指向下一个结点,即,q=p->next。然后再释放p。在这里插入图片描述
    3.接下来反复执行p=q;q=q->next在这里插入图片描述
    4.结束条件为:p=NULL
      (循环条件为:p!=NULL
    5.将头结点的指针域设置为空,即L->next=NULL
  • 算法描述
Status ClearList_L(LinkList& L)   //将L设置为空表
{
   Lnode *p,*q;           //或LinkList p,q;
   p = L->next;           //p指向首元结点
   while (p) 
   {
   	q = p->next;     //q指向下一个结点
   	delete p;        //删除当前结点
   	p = q;           //将下一结点设置为当前结点
   }
   L->next = NULL;      //头结点的指针域置空
   return OK;
}

5.求单链表的长度

  • 算法思路:从首元结点开始,依次计数所有结点
    怎么能让指向当前结点指针p指向下一结点?

    p=p->next;          //p指向下一个结点,p往后移动一个结点
    

    1.先定义一个指针p,指向当前结点(一开始,p是指向首元结点的指针),即,p=L->next
    2.若p不为空,则计1,再让p指向下一结点,即,p=p->next
    3.结束条件为:p=NULL
      (循环条件为:p!=NULL

  • 算法描述

int ListLength_L(LinkList L)   //返回L中数据元素的个数
{
   Lnode *p;           //或LinkList p;
   p = L->next;        //p指向首元结点
   i = 0;              //计数
   while (p)           //遍历单链表,统计结点数
   {
   	i++;
   	p = p->next;    //p指向下一个结点
   }
   return i;
}
  • 17
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言完成单链表个基本操作的代码和解释: 1. 创建链表 ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; struct Node* createList(int n) { struct Node *head, *p, *q; int i; head = (struct Node*)malloc(sizeof(struct Node)); head->next = NULL; q = head; for (i = 0; i < n; i++) { p = (struct Node*)malloc(sizeof(struct Node)); scanf("%d", &p->data); p->next = NULL; q->next = p; q = p; } return head; } ``` 解释:首先定义了一个结构体Node,包含数据域data和指针域next。createList函数用于创建链表,参数n表示链表中节点的个数。首先创建头节点head,并将其next指针置为NULL。然后用q指针指向头节点,循环n次,每次创建一个新节点p,输入数据并将其next指针置为NULL,将q的next指针指向p,再将q指向p,最后返回头节点head。 2. 销毁链表 ```c void destroyList(struct Node* head) { struct Node* p = head; while (p != NULL) { head = head->next; free(p); p = head; } } ``` 解释:destroyList函数用于销毁链表,参数head为头节点。首先定义一个指针p指向头节点,循环遍历链表,每次将head指向下一个节点,释放p所指向的节点,再将p指向head,直到p指向NULL。 3. 在链表的最前面插入元素 ```c struct Node* insertAtBeginning(struct Node* head, int data) { struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->next = head; head = p; return head; } ``` 解释:insertAtBeginning函数用于在链表的最前面插入元素,参数head为头节点,data为要插入的数据。首先创建一个新节点p,将其data域赋值为data,将其next指针指向head,再将head指向p,最后返回头节点head。 4. 在链表的最后面插入元素 ```c struct Node* insertAtEnd(struct Node* head, int data) { struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->next = NULL; if (head == NULL) { head = p; } else { struct Node* q = head; while (q->next != NULL) { q = q->next; } q->next = p; } return head; } ``` 解释:insertAtEnd函数用于在链表的最后面插入元素,参数head为头节点,data为要插入的数据。首先创建一个新节点p,将其data域赋值为data,将其next指针置为NULL。如果head为NULL,即链表为空,将head指向p;否则,定义一个指针q指向head,循环遍历链表,直到q的next指针为NULL,将q的next指针指向p,最后返回头节点head。 5. 判断链表是否为空 ```c int isEmpty(struct Node* head) { return head == NULL; } ``` 解释:isEmpty函数用于判断链表是否为空,参数head为头节点。如果head为NULL,即链表为空,返回1;否则,返回0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值