线性表的链式存储方式,求表长、插入新结点及两种查找方式

本文详细介绍了单链表的初始化方法,如何求链表长度,按值和序号查找元素,以及在带头指针的链表中插入元素的步骤。
摘要由CSDN通过智能技术生成

1、单链表的初始化

首先定义一个结构体链表,每一个结构链表里面包含两种东西,数据域和指针域。

typedef struct LNode* List;//定义了一个指向结构体LNode的指针类型 取个名字List
sturct LNode{
	ElementType Date;//数据域
    List Next;//指针域 指向下一个结点的指针
};
struct LNode L;//定义了一个名为L的结构体变量  就是上边LNode那个结构体
List PtrL;//名为PtrL的指针变量

在这个代码中,只创建了一个结构体链表

接着初始化:

Status InitList(LinkList &L)//定义一个空链表
{
     L=new LNode;//先开辟一个新结点,与顺序表初始化一样,也是用new 但是指针L得指向头指针,便于后续操作
     L->next=NULL;//头结点指针域肯定为空。
     return OK;//告诉函数我做完了 可以返回了
}

2.求表长

求长度可以用遍历,就是把每一个元素一个一个看看,然后用一个累加器加起来

int Length(List PtrL)//只知道头指针
{
   List p=PtrL;//设一个临时指针p指向表的第一个结点
   int j=0;//累加器
   while(p){//循环条件? 链表还没结束,就是p指针不等于空
   p=p->Next;//链表的指针往后挪一位
   j++;//每遍历一个加个1
   }
   return j;
}

循环条件为指针p不为空,然后p一直指向后一个就可以了

3.查找

第一种是按值查找

LNode *LocateElem(LinkList L,ElemType e)
{
    p=L->Next;//p设为链表的头
    while(p!=NULL && p->Date!=e)//表不空 然后另外一个 就是没找到  就是Date不等于e
    {
       p=p->Next;//遍历链表  一直往后挪 
    }
    return p;
}

这个循环退出来只有两种可能,1是Date找到e了 那就返回e所在结点的地址就是p

2是p=NuLL 就是没找到这个值。

第二种是按序号查找:

LNode* LocateElem(int k, LinkList L)
{
	LinkList p = L->Next;
    int i=1;
	while (p != NULL && i < k)
	{
		p = p->Next;
		i++;
	}
	if (i == k) return p;
	else return NULL;
}

4.单链表的插入(带头指针的链表L中的i个位置插入值为e的插入)

插入步骤:首先我得查找到后一个结点,然后让指针p指向它

                  接着生成一个新的结点*s 这个结点的作用是把你要插入的那个结点Date 及指针域都赋给他

                  接着把e赋给新结点的Date

                 再着把指针域也赋给前一个结点

                 最后p结点指向s

就是这个意思:你插入一个东西 你插入的那个地方他后边的地址你得知道 前一个地址你也得知道,它的前一个地址我用p来指着呢   当要插入的这个东西你把它也弄个指针域就是*s  你*s指向后一个的地址  然后再让前一个地址指向*s就完事了

Status ListInsert(LinkList& L, int i, Elemtype e)
{
	p = L;
	j = 0;
	while (p && (j < i - 1))//查找第i-1结点  也可以用前边的那个函数
	{
		p = p->Next;
		j++;
	}
	s = new LNode;//创建一个新结点s
	s->Date = e;//将e的值赋给s的数据域
	s->Next = p->Next;//将新节点s的指针指向原来第i个节点的下一个节点
	p->Next = s;//p结点指向s
	return OK;
}

     s->Next = p->Next;
    p->Next = s;  

这两个代码不能搞反

答案为B。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值