题目链接
零、基础
参考:
【创】链表、头指针、头结点、第一个结点
C++结构体和链表
C++链表的理解及创建链表(附源码)
单链表的基本设计(C语言代码实现)
创建链表
用结构体类型来表示一个节点
#include<iostream>
using namespace std;
typedef struct Lnode{
int data; // 数据域
Lnode *next; // 指针域
}*Linklist;
创建长度为Length的链表
void creatList(Linklist L, int length){//创建一个长度为length的链表,头结点不算
int i=0;
Linklist p1,p2;
p1=p2=L;
while(i<length){ //尾插法,就是说在尾部加新节点
p1=new Lnode;
p1->data=i+1;
p2->next=p1;
p2=p1;
++i;
}
p2->next=nullptr; //最后一个节点的指针域赋空指针
}
删除节点
void delnode(Linklist L){ //删除所创建链表的所有节点,包括头指针
Linklist tmp,p;
p=tmp=L;
while(p->next){ //删除当前节点之前,要保存下一个节点的指针,这样才不会断链
tmp=p->next;
delete p;
p=tmp;
}
delete p;
}
int main(){
Linklist L=new Lnode; //L是指向头结点的指针,这几句都是创建一个头结点
L->data=0;
L->next=nullptr;
creatList(L,4); //创建一个长度为4的链表,数据域分别为1,2,3,4,头结点另算
Linklist p;
p=L;
while(p->next){ //从头结点开始打印节点的数据域
cout<<p->data<<endl;
p=p->next;
} //打印出了最后一个的所有节点的数据域
cout<<p->data<<endl; //打印最后一个节点的数据域
delnode(L);
return 0;
}
例子: 创建链表,自己输入数据
参考:C++结构体和链表
#include<bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node *next;
};
Node *head,*p,*r;
int x;
int main(){
cin >> x;
head = new Node; // 申请head
r=head;
while(x!=1){
p = new Node; // 申请新结点
p -> data = x; // 新结点的数据为x
p -> next = NULL; // 新节点的指针为NULL
r -> next = p; // 把新结点链接到前面
r = p; // 移动r
cin >> x; // 循环输入x
}
/* 输出链表*/
p = head->next;
while(p->next !=NULL){
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl; //注意*
return 0;
}
单链表查找
p = head->next;
int i = 0;
while(p -> next !=NULL){
if(p-> data == 3){
i++;
}
p = p->next
}
cout << "链表中数据为3的个数有" << i <<"个"<<endl;
插入
/*在第i个位置插入x*/
void Insert(Node *head, int i, int x){
Node *p, *s;
int j; // j==i时候,插入新结点
p = head;
j = 0;
while(p != NULL && (j<i-1)){
//j==i的那个位置,插入,所以i前面的i-1节点的next要指向s
p = p->next; //一直循环到上图的p结点
j=j+1;
}
if(p==NULL){
cout << “没有这个位置” <<endl;
}else{
s = new Node; //分配新结点
s->data = x;
s->next = p->next;
p->next = s;
}
}
单链表删除
/*删除第i个结点*/
void Delete(Node *head ,int i){
Node *p, *s;
int j;
p = head;
j = 0;
while(p!=NULL &&(j<i-1)){
p=p->next;
j=j+1;
}
if(p==NULL){
cout<<"没有这个位置"<<endl;
}else{
s= p->next;
p->next = p->next->next;
free(s);
}
}