3.2.1 单链表的整表创建和删除

    创建单链表的过程就是个动态、生成链表的过程。即从"空表"的初始状态起,依次建立各元素结点,并逐个插入链表。

头插法

算法思路:

1.声明一结点p和计数器变量i;
2.初始化一空链表L;
3.让L的头结点的指针指向NULL ,即建立一个带头结点的单链表i;
4.循环 :
    • 生成新结点赋值给 p;
    • 随机生成数字赋值给p的数据域 p->data;

    • 将p插入到头结点与前一新结点之间。

逻辑图:


代码

/*	随机产生 n 个元素的值,建立带表头结点的单链线性表 L(头插法) */
void CreateListHead(LinkList *L, int n)
{
    LinkList p;//创建一个新链表,单节点
    int i;
    srand(time(0));	/*  初始化随机数种子 */
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;	/*先建立一个带头结点的单链表 */
    for (i=0; i<n; i++)
    {
        p = (LinkList)malloc(sizeof(Node)); /*	生成新结点 */
        p->data = rand()%100+1;	/*	随机生成 100 以内的数字 */
        p->next = (*L)->next;
 
        (*L)->next = p;	/*插入到表头,指向节点P,而不是节点的数据域,即不是(*L)->next = p->data */
    }
}

尾插法:

算法思路:

1.声明一中间结点p、尾节点r和计数器变量i;
2.初始化一空链表L;
3.让L的头结点的指针指向NULL ,即建立一个带头结点的单链表;
4.让尾节点r等于单链表L;
5.循环 :
    • 生成一新结点赋值给 p;
    • 随机生成一数字赋值给p的数据域 p->data;
    • 将尾节点r的指针域指向p;
    • 让尾节点r等于节点p;

6.尾节点r指针域指向NULL;

代码:

/*随机产生 n 个元素的值,建立带表头结点的单链线性表 L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
    LinkList p,r;
    int i;
    srand(time(0));	/*  初始化随机数种子 */
    *L = (LinkList)malloc(sizeof(Node)); /* L 为整个线性表 */
    r=*L;	/* r 为指向尾部的结点 */
    for (i=0; i<n; i++)
    {
        p = (Node *)malloc(sizeof(Node)); /*	生成新结点 */
        p->data = rand()%100+1;	/*	随机生成 100 以内的数字 */
        r->next=p;	/*  将表尾终端结点的指针指向新结点 */
        r = p;	/*  将当前的新结点定义为表尾终端结点 */
    }
    r->next = NULL;	/*  表示当前链表结束 */
}

解释:



整表的删除:

算法思路:
1. 声明一结点 p q ;
2. 将第一个结点赋值给 p;
3. 循环:
    • 将下一结点赋值给 q;
    • 释放 p;

    • 将 q 赋值给 p 。

代码

/*  初始条件:顺序线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(LinkList *L)
{
    LinkList p,q;
    p=(*L)->next;	/*p 指向第一个结点 */
    while(p)	/*没到表尾 */
    {
        q=p->next; 
        free(p); 
        p=q;
    }
    (*L)->next=NULL;	/* 头结点指针域为空 */
    return OK;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值