二、线性表的链式存储(下)

Exercise

结点结构:数据域+指针域
结构体定义:

typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode,*LinkList;

1.创建单链表

//单链表:带头结点的头插法
LinkList Head_InsertNode(LinkList &L)
{
Lnode *p;
int x;
L=(Lnode *)malloc(sizeof(Lnode));//头结点
L->next=null;
scanf("%d",&x);//输入结点的值
    while(x!=9999)//null
    {
    p=(Lnode *)malloc(sizeof(Lnode));//创建新结点
    p->next=L->next;
    L->next=p
    p.data=x;
    scanf("%d",&x);
    }
return L;
}

//不带头结点的头插法
LinkList Head_InsertNode(LinkList &L)
{
LinkList L;//指向单链表的指针
L->next=null;
Lnode *p;//工作指针
int x;
scanf("%d",&x);
//第一个结点
p=(Lnode *)malloc(sizeof(Lnode));
L->next=p;
p->data=x;
L=P;
scanf("%d",&x);
while(x!=9999)//其他结点
    {
    p=(Lnode *)malloc(sizeof(Lnode));//新结点
    p->next=L->next;
    p->data=x;
    L->next=p;
    scanf("%d",&x);
    }
return L;
}


2.按位查找(带头结点)
给定一个位序i,找不到就返回null

Lnode * GetElem(LinkList L,ElemType i)
{
if(i<1)
	return null;//输入位置无效
int j=1;//计数
Lnode *p=L->next;
while(i<j&&p!=null)
	{
	p=p->next;
	j++;
	}
return p;
}

3.按值查找(带头结点)
按照给定的值e查找,找到就返回指针


Lnode * LocateElem(LinkList L,ElemType e)
{
Lnode *p=L->next;
while(p!=null&&p->data!=e)
	{
	p=p->next;
	}
return p;
}

4.指定节点的插入,在p结点前插入s
前插:如果在p结点前插入,则需要循环找到p的前驱
后插:插入一个新结点,再将两个结点的数据交换即可,无需遍历链表

//exp:后插
bool InsertPirorNode(Lnode *p,Lnode *s)
{
if(p==null)
	return false;//
if(s==null)
	return false;//内存分配失败
Lnode *s=(Lnode *)malloc(sizeof(Lnode));
s->next=p->next;
p->next=s;
s->data=L->data;
L->data=e;
return true;
}

5.删除结点
先判断删除位置是否合理,再删除即释放不用的结点

//按位序i删除指定值e
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)
	return false;
Lnode *p=L->next;//指向头结点
int j=1;
while(p!=null&&j<i)
	{
	p=p->next;
	j++;//找到i
	}
//找到了i以后判断删除位置是否合理
if(p==null)
	return false;//
if(p->next==null)
	return false;//到了表尾,最后一位不删
//删除
Lnode *q=P->next;//q指向被删除结点
p->next=q->next;
//p->next=p->next->next;
free(q);
return ture;
}

6.求表长

//带头结点
int length(LinkList L)
{
int len=0;
Lnode *p=L;//指向表头
while(p->next!=null)
len++;
return len;
}
//不带头结点
int length(LinkList L)
{
int len=1;//先+1,后+1都可??
Lnode *p=L->next;//指向表头
while(p->next!=null)
len++;
return len;
}

习题总结

1.使用指针可以很方便地表示各种逻辑结构
2.在链表的末尾插入和删除一个结点时,需要修改其相邻结点的指针域,而寻找尾结点及其前驱结点时,只有带头结点的双循环链表所需的时间最少。
3.循环单链表,头指针head,有head->next->next==head,则线性表长度为?
易知可为1,同时,如果是一个空表,因为head->next=head,而head->next=head,上式也成立。因此表长可为1也可为0
4.断链:如果链表前后有指针指示,不会因为语序的不同而造成断链。
5.带头结点的单链表,结构为data:link
只给出头指针list,在不改变链表的前提下,查找倒数为k的位置上的结点data,成功就输出data值,并返回1,否则,返回0

思考:什么情况下会查找失败?
当k>count时,会失败

typedef struct Lnode()
{
ElemType data;
struct Lnode *link;
}Lnode, *Linklist;
int search(Linklist &L,int k)
{
Lnode *p=link->link;*q=list->link;//q定位到末尾,p指示k的位置
int count=0;
while(q!=null)//遍历链表
	{
	if(count>=k)//当移动到正序的k位置时,p也开始移动
		p=p->link;
	q=q->link;
	count++;
	}
if(k>count)
	return 0;
printf("%d",p->data);
return 1;
}

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
线性的链存储结构是使用链线性中的元素存储起来。链可以分为单链、循环链和双链。在单链中,每个结点都包含指向下一个结点的指针。循环链是在单链的基础上,将最后一个结点的指针指向头结点,形成一个循环。而双链则是在单链的基础上,每个结点都包含指向前一个结点和后一个结点的指针。链存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上。因此,链中结点的逻辑顺序和物理顺序不一定相同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [数据结构——线性的链存储](https://blog.csdn.net/weixin_46272350/article/details/119612209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [线性的链存储结构..](https://download.csdn.net/download/N201871643/86035198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只爱圣女果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值