定义存储结构(以单向链表为主)
对于链表的定义,通过结构体进行定义,包括两部分,一是数据域,另一个就是指针,用于指向下一个节点。
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;//队列式
如图所示:
2,链表的查询(按序号、按数据元素)
例如:找数据域为a3的节点(按数据元素查找)
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
只需要查找p->data是不是a3即可,若不是,接着查找下一个,p=p->next;
head = p;//首先,将给定的head头指针赋值给指针p
while(p->data != a3){//若当前节点的数据域不是a3p = p->next;//进行下一个节点判断
}
例如:找序号为4的节点(按序号查找)
也就是查询4次即可。
首先,有头有尾成链才是链表;链表的查询是建立在已创建链表的基础上。
这里只需要定义一个变量wsq用于存储序号即可,通过自加操作,到达4,则停下即可。
head = p;//首先,将给定的head头指针赋值给指针p
int wsq=0;
while(wsq != 4){//若当前节点的数据域不是a3p = p->next;//进行下一个节点判断wsq++;//序号自加
}
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,链表的删除
例如:删除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需要进行回收一下即可
最后的效果图如下:
5,链表的输出
p = head;
while(p != NULL){//全部挨个输出printf("%d",p->data);p = p->next;//找下一个节点
}
while(p->next != NULL){//最后一个节点不输出printf("%d",p->data);p = p->next;//找下一个节点
}