线性结构常规操作(四)

定义存储结构(以单向链表为主)

对于链表的定义,通过结构体进行定义,包括两部分,一是数据域,另一个就是指针,用于指向下一个节点。

1,创建链表

定义链表:

struct nodesq{
	int data;//数据域,这里以int为例
	struct nodesq * netx;//指向自身类型的指针域
}

创建链表:栈式(往前/左走)、队列式(往后/右走)
一般创建链表是通过循环创建的,这里为了方便理解才这样创建的。

struct nodesq *p1,*p2,*p3;
p1 = new nodesq;
p1->date = a1;
p2 = new nodesq;
p2->date = a2;
//p2->next = p1;//栈式,即后来的当head
p1->next = p2;//队列式

如图所示:
线性结构常规操作(四)_第1张图片

2,链表的查询(按序号、按数据元素)

线性结构常规操作(四)_第2张图片
例如:找数据域为a3的节点(按数据元素查找)
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
只需要查找p->data是不是a3即可,若不是,接着查找下一个,p=p->next;

head = p;//首先,将给定的head头指针赋值给指针p
while(p->data != a3){//若当前节点的数据域不是a3
	p = p->next;//进行下一个节点判断
}

例如:找序号为4的节点(按序号查找)
也就是查询4次即可。
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
这里只需要定义一个变量wsq用于存储序号即可,通过自加操作,到达4,则停下即可。

head = p;//首先,将给定的head头指针赋值给指针p
int wsq=0;
while(wsq != 4){//若当前节点的数据域不是a3
	p = p->next;//进行下一个节点判断
	wsq++;//序号自加
}
3,链表的插入

线性结构常规操作(四)_第3张图片
例如:在a3之前插入数据域为a2‘的节点S
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
在a3之前插入a2’,这里关键点在于:①找到a3前的一个节点a2,将新插入的a2‘数据域对应的节点S的next指向a3节点。②a2所在的节点的next指向a2’所在的节点S。

head = p;//首先,将给定的head头指针赋值给指针p
while(p->next->data != a3){//找a3前一个节点
	p = n->next;//没找到,指针找下一个节点
}//当结束循环之后,p指向a3上一个节点位置
S->next = p->next;//p->next此时为a3所在节点,赋值给S节点的next,即S节点的next指向a3所在节点,此时a2所在节点和S节点的next都指向a3所在的节点
p->next = S;//将a2所在的节点原本指向a3所在节点,给改成指向S节点

最终实现效果图如下:
线性结构常规操作(四)_第4张图片

4,链表的删除

线性结构常规操作(四)_第5张图片
例如:删除a3所在的节点
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
删除a3所在的节点,需要找到a3所在的节点之前的一个节点,即a2所在的节点。然后,将a2所在的节点的next指向a3所在节点的下一个节点。

head = p;//首先,将给定的head头指针赋值给指针p
while(p->next->data != a3){//找a3前一个节点
	p = n->next;//没找到,指针找下一个节点
}//当结束循环之后,p指向a3上一个节点位置,即a2所在的节点
p->next = p->next->next;//p->next->next即a3所在节点的下一个节点,也就是a4所在的节点位置  赋值给  p->next也就是a2所在的节点的next

之后a3需要进行回收一下即可
最后的效果图如下:
线性结构常规操作(四)_第6张图片

5,链表的输出
p = head;
while(p != NULL){//全部挨个输出
	printf("%d",p->data);
	p = p->next;//找下一个节点
}
while(p->next != NULL){//最后一个节点不输出
	printf("%d",p->data);
	p = p->next;//找下一个节点
}
6,循环链表

线性结构常规操作(四)_第7张图片

7,双向链表

线性结构常规操作(四)_第8张图片

8,带头链表

在这里插入图片描述

9,无头链表

线性结构常规操作(四)_第9张图片

你可能感兴趣的:(数据结构)