链表的基本操作
记录下C/C++链表基本操作。
#include <cstdio>
#include <cstdlib>
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;//新建结点
p->data = Array[i];//赋给新建结点作为数据域 ,也可以scanf输入
p->next = NULL;//新结点的指针域设为NULL
pre->next = p;//前驱结点的指针域设为 当前新建结点的地址
pre = p;//把pre设为p,作为下个结点的前驱结点
}
return head;//返回头结点指针
}
int search(node* head,int x){//查找元素
int count = 0;//计数
node* p = head->next;
while(p != NULL){
if(p->data == x){
count++;
}
p = p->next;
}
return count;
}
void insert(node* head,int pos,int x){//将x插入以head为头结点的链表的第pos位置上
node* p = head;
for(int i=0;i<pos-1;i++){
p = p->next;//pos-1为了到插入结点的前一个结点
}
node* q = new node;//新建结点
q->data = x;
q->next = p->next;//新结点的下一个结点指向原先插入位置的节点
p->next = q;//前一个位置的结点指向新结点
}
void del(node* head,int x){//删除以head为头结点的链表中所有数据域为x的结点
node* p = head->next;
node* pre = head;
while(p != NULL){
if(p->data == x){
pre->next = p->next;
delete(p);
p = pre->next;
}
else{
pre = p;
p = p->next;
}
}
}
int main(){
int Array[5] = {5,3,6,1,2};
node* L = create(Array);//新建链表,返回头指针head赋给L
int c = search(L,5);
printf("%d\n",c);
insert(L,3,4);
del(L,4);
L = L->next;//从第一个结点开始有数据域
while(L != NULL){
printf("%d ",L->data);
L = L->next;
}
delete (L);
return 0;
}
参考资料–《算法笔记》