创建链表
#include<bits/stdc++.h>
using namespace std;
struct node{
//链表结点
int data;
node *next;
};
//创建链表
node *create(int Array[]){
node *p,*pre,*head;//pre保存当前结点的前驱结点,head为头结点
head=new node;//创建头结点
head->next=NULL;//头结点不需要数据域,指针域初始化为NULL
pre=head;//记录pre为head
for(int i=0;i<5;i++){
p=new node;//新建结点
//将Array[i]作为新建结点的数据域,也可以输入
p->data=Array[i];
p->next=NULL;//将新结点的指针域设为NULL
pre->next=p;
pre=p;//把pre设为p,作为下个结点的前驱结点
}
return head;//返回头结点指针
}
int main(){
int Array[5]={5,3,6,1,2};
node *l=create(Array);//新建链表,返回的头指针head赋给L
l=l->next;//从第一个结点开始有数据域
while(l!=NULL){
printf("%d ",l->data);
l=l->next;
}
return 0;
}
输出结果:5 3 6 1 2
查找元素
查找元素时只需要从第一个结点开始,不断判断当前结点的数据域是否等于x,如果等于,计数器count加一,这样到达链表结尾时,count的值就是链表中元素x的个数。
//在以head为头结点的链表上计数元素x的个数
int search(node *head,int x){
int count=0;//计数器
node *p=head->next;//从第一个结点开始
while(p!=NULL){
//没有到达链表末尾
if(p->data==x){
count++;//当前结点数据域为x,则count++;
}
p=p->next;//指针指向下一个结点
}
return count;//返回计数器count
}
上面这部分代码可以直接写在”创建链表“部分的代码中使用,把create函数返回的头指针L直接作为第一个参数L传入即可。
插入元素
对链表来说,插入元素是指在给定的链表中的地方插入一个结点。例如,在链表的第三个位置插入元素x,是指在插入操作完成之后链表的第3个元素为x
示例代码:
//将x插入以head为头结点的链表的第pos个位置上
void insert(node *head,int pos,int x){
node *p=head;
for(int i=1;i<pos;i++){
p=p->next;//到插入位置的前一个结点
}
node *q=new node;//新建结点
q->data=x;//新结点的数据域为x
q->next=p->next;//新结点的下一个结点指向原先插入位置的结点
p->next=q;//前一个位置的结点指向新结点
}
删除元素
对链表来说,删除元素是指删除链表上的所有值为给定的数x
删除操作时这样进行的
1、由指针变量p枚举结点,另一个指针变量pre表示p指向结点的前驱结点
2、当p所指结点的数据域恰好为x时,进行下面三个操作
(1)令pre所指结点的指针域next指向p结点所指结点的下一个结点
(2)释放p所指结点的内存空间
(3)令p指向pre结点的下一个结点
具体代码如下:
void del(node *head,int x){
node *p=head->next;//p从第一个结点开始枚举
node *pre=head;//pre始终保存p前驱结点的指针
while(p!=NULL){
if(p->data==x){
//数据域恰好为x,说明要删除该结点
pre->next=p->next;
delete(p);
p=pre->next;
}else{
//数据域不是x,则p和pre都后移一位
pre=p;
p=p->next;
}
}
}