柚子快报邀请码778899分享:html 【数据结构】链表

http://yzkb.51969.com/

单链表操作

插入: 传入表头,待插入的值,插入的位置。其中位置

i

i

i 表示原链表第

i

1

i-1

i−1 到

i

i

i 之间,也可以理解为新插入的数占据原链表的

i

i

i 位置,然后原

i

i

i 位置及以后要向后移。

算法流程: ①判边界:由上定义,边界值

1

1

1 表示头节点和第一个节点的中间插入,边界值 Head->data+1 表示在最后一个元素之后插入一个数 ②表头表示链表大小的数据域Head->data++ ③链表操作通常都多定义一个p来从头节点开始进行操作 ④开始循环定位,注意while(--i)是先进行--再判断是否为

0

0

0,故循环会使 p 移动至 i-1 位置处 ⑤new出一个新节点,先使新节点s->next=p->next表示新节点指向原来的第

i

i

i 个节点,然后p->next=s表示原第

i

1

i-1

i−1 个节点指向新节点。图示如下:

bool insertNode(Node* Head,int val,int i){

if(i<1||i>Head->data+1){

puts("error");

return false;

}

Head->data++;

Node* p=Head;

while(--i){

p=p->next;

}

Node* s=new Node;

s->data=val;

s->next=p->next;

p->next=s;

return true;

}

删除: 传入表头,删除的位置,其中

i

i

i 的边界和插入操作比起来右边界缩短了一节,因为删除操作也是通过对

i

1

i-1

i−1 操作来删除节点

i

i

i 的

算法流程: ①判边界,同插入操作 ②表头表示链表大小的数据-- ③循环移动,同插入,最终定位到

i

1

i-1

i−1 ④先将第

i

i

i 个节点用指针表示出来,即 Node* s=p->next,然后让第

i

1

i-1

i−1 个节点指向第

i

+

1

i+1

i+1 个节点,即p->next=s->next即可

bool removeNode(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return false;

}

Node* p=Head;

p->data--;

while(--i){

p=p->next;

}

Node* s=p->next;

p->next=s->next;

delete s;

return true;

}

打印整个链表: 传入表头,循环遍历。注意要先输出再p=p->next,不然输出最后的时候会遇上一个没有数据的空指针

算法流程: ①定义指针Node* p=Head->next使其指向第一个节点 ②输出当前数据域,然后让指针指向下一个(不能反)

void printList(Node* Head){

Node* p=Head->next;

while(p){

cout<data<<" ";//注意

p=p->next;

}

cout<

}

创建链表: 一直调用插入即可

void createList(Node* &Head,int* value,int n){

Node* p=Head;

for(int i=n;i>=1;i--){

insertNode(Head,value[i],1);

}

}

删除整个链表: 读取头节点储存的节点个数,循环调用删除

void deleteList(Node* Head){

int n=Head->data;

while(n--){

removeNode(Head,1);

}

}

循环链表: 将最后一个节点的指针域由空改为指向头节点,可以创建头指针时让它指向自己,然后其他操作一致即可实现。

DS单链表–存储结构与操作

#include

using namespace std;

struct Node{

int data;

Node* nxt;

};

bool insertNode(Node* Head,int val,int i){

if(i<1||i>Head->data+1){

puts("error");

return false;

}

Head->data++;

Node* p=Head;

while(--i){

p=p->nxt;

}

Node* s=new Node;

s->data=val;

s->nxt=p->nxt;

p->nxt=s;

return true;

}

bool removeNode(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return false;

}

Node* p=Head;

p->data--;

while(--i){

p=p->nxt;

}

Node* s=p->nxt;

p->nxt=s->nxt;

delete s;

return true;

}

void printList(Node* Head){

Node* p=Head->nxt;

while(p){

cout<data<<" ";

p=p->nxt;

}

cout<

}

void createList(Node* &Head,int value[],int n){

Node* p=Head;

for(int i=n;i>=1;i--){

insertNode(Head,value[i-1],1);

}

}

void findVal(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return ;

}

Node* p=Head;

while(i--){

p=p->nxt;

}

cout<data<

}

int main(){

int n;

cin>>n;

int* a=new int[n];

for(int i=0;i

cin>>a[i];

Node* Head=new Node;

Head->nxt=NULL,Head->data=0;

createList(Head,a,n);

printList(Head);

int pos,val;

cin>>pos>>val;

if(insertNode(Head,val,pos))

printList(Head);

cin>>pos>>val;

if(insertNode(Head,val,pos))

printList(Head);

cin>>pos;

if(removeNode(Head,pos))

printList(Head);

cin>>pos;

if(removeNode(Head,pos))

printList(Head);

cin>>pos;

findVal(Head,pos);

cin>>pos;

findVal(Head,pos);

return 0;

}

B. DS单链表–结点交换

#include

using namespace std;

struct Node{

int data;

Node* nxt;

};

bool insertNode(Node* Head,int val,int i){

if(i<1||i>Head->data+1){

puts("error");

return false;

}

Head->data++;

Node* p=Head;

while(--i){

p=p->nxt;

}

Node* s=new Node;

s->data=val;

s->nxt=p->nxt;

p->nxt=s;

return true;

}

bool removeNode(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return false;

}

Node* p=Head;

p->data--;

while(--i){

p=p->nxt;

}

Node* s=p->nxt;

p->nxt=s->nxt;

delete s;

return true;

}

void printList(Node* Head){

Node* p=Head->nxt;

while(p){

cout<data<<" ";

p=p->nxt;

}

cout<

}

void createList(Node* &Head,int value[],int n){

Node* p=Head;

for(int i=n;i>=1;i--){

insertNode(Head,value[i-1],1);

}

}

void findVal(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return ;

}

Node* p=Head;

while(i--){

p=p->nxt;

}

cout<data<

}

bool swapNode(Node* Head,int i,int j){

if((i<1||i>Head->data)||(j<1||j>Head->data)){

puts("error");

return false;

}

Node* p1=Head;

Node* p2=Head;

while(--i){

p1=p1->nxt;

}

while(--j){

p2=p2->nxt;

}

Node* t1=p1->nxt;

Node* t2=p2->nxt;

p1->nxt=t2;

p2->nxt=t1;

Node* tmp=t1->nxt;

t1->nxt=t2->nxt;

t2->nxt=tmp;

return true;

}

int main(){

int n;

cin>>n;

int* a=new int[n];

for(int i=0;i

cin>>a[i];

Node* Head=new Node;

Head->nxt=NULL,Head->data=0;

createList(Head,a,n);

printList(Head);

int posa,posb;

cin>>posa>>posb;

if(swapNode(Head,posa,posb))

printList(Head);

cin>>posa>>posb;

if(swapNode(Head,posa,posb))

printList(Head);

return 0;

}

C. DS单链表–合并

#include

using namespace std;

struct Node{

int data;

Node* nxt;

};

bool insertNode(Node* Head,int val,int i){

if(i<1||i>Head->data+1){

puts("error");

return false;

}

Head->data++;

Node* p=Head;

while(--i){

p=p->nxt;

}

Node* s=new Node;

s->data=val;

s->nxt=p->nxt;

p->nxt=s;

return true;

}

bool removeNode(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return false;

}

Node* p=Head;

p->data--;

while(--i){

p=p->nxt;

}

Node* s=p->nxt;

p->nxt=s->nxt;

delete s;

return true;

}

void printList(Node* Head){

Node* p=Head->nxt;

while(p){

cout<data<<" ";

p=p->nxt;

}

cout<

}

void createList(Node* &Head,int value[],int n){

Node* p=Head;

for(int i=n;i>=1;i--){

insertNode(Head,value[i-1],1);

}

}

void findVal(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return ;

}

Node* p=Head;

while(i--){

p=p->nxt;

}

cout<data<

}

Node* mergeList(Node* HeadA,Node* HeadB){

Node* HeadC=new Node;

Node* pc=HeadC;

HeadC->nxt=NULL,HeadC->data=0;

Node* pa=HeadA->nxt;

Node* pb=HeadB->nxt;

while(pa!=NULL&&pb!=NULL){

if(pa->data>pb->data){

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

else if(pa->datadata){

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

}

else{

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

}

while(pa!=NULL){

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

}

while(pb!=NULL){

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

return HeadC;

}

bool swapNode(Node* Head,int i,int j){

if((i<1||i>Head->data)||(j<1||j>Head->data)){

puts("error");

return false;

}

Node* p1=Head;

Node* p2=Head;

while(--i){

p1=p1->nxt;

}

while(--j){

p2=p2->nxt;

}

Node* t1=p1->nxt;

Node* t2=p2->nxt;

p1->nxt=t2;

p2->nxt=t1;

Node* tmp=t1->nxt;

t1->nxt=t2->nxt;

t2->nxt=tmp;

return true;

}

int main(){

int n;

cin>>n;

int* a=new int[n];

for(int i=0;i

cin>>a[i];

int m;

cin>>m;

int* b=new int[m];

for(int i=0;i

cin>>b[i];

Node* HeadA=new Node;

HeadA->nxt=NULL,HeadA->data=0;

createList(HeadA,a,n);

Node* HeadB=new Node;

HeadB->nxt=NULL,HeadB->data=0;

createList(HeadB,b,m);

Node* HeadC=mergeList(HeadA,HeadB);

printList(HeadC);

return 0;

}

D. DS循环链表—约瑟夫环(Ver. I - A)

#include

using namespace std;

struct Node{

int data;

Node* nxt;

};

bool insertNode(Node* Head,int val,int i){

if(i<1||i>Head->data+1){

puts("error");

return false;

}

Head->data++;

Node* p=Head;

while(--i){

p=p->nxt;

}

Node* s=new Node;

s->data=val;

s->nxt=p->nxt;

p->nxt=s;

return true;

}

bool removeNode(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return false;

}

Node* p=Head;

p->data--;

while(--i){

p=p->nxt;

}

Node* s=p->nxt;

p->nxt=s->nxt;

delete s;

return true;

}

void printList(Node* Head){

Node* p=Head->nxt;

while(p){

cout<data<<" ";

p=p->nxt;

}

cout<

}

void createList(Node* &Head,int value[],int n){

Node* p=Head;

for(int i=n;i>=1;i--){

insertNode(Head,value[i],1);

}

while(p->nxt){

p=p->nxt;

}

p->nxt=Head->nxt;

}

void findVal(Node* Head,int i){

if(i<1||i>Head->data){

puts("error");

return ;

}

Node* p=Head;

while(i--){

p=p->nxt;

}

cout<data<

}

Node* mergeList(Node* HeadA,Node* HeadB){

Node* HeadC=new Node;

Node* pc=HeadC;

HeadC->nxt=NULL,HeadC->data=0;

Node* pa=HeadA->nxt;

Node* pb=HeadB->nxt;

while(pa!=NULL&&pb!=NULL){

if(pa->data>pb->data){

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

else if(pa->datadata){

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

}

else{

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

}

while(pa!=NULL){

insertNode(HeadC,pa->data,HeadC->data+1);

pa=pa->nxt;

}

while(pb!=NULL){

insertNode(HeadC,pb->data,HeadC->data+1);

pb=pb->nxt;

}

return HeadC;

}

bool swapNode(Node* Head,int i,int j){

if((i<1||i>Head->data)||(j<1||j>Head->data)){

puts("error");

return false;

}

Node* p1=Head;

Node* p2=Head;

while(--i){

p1=p1->nxt;

}

while(--j){

p2=p2->nxt;

}

Node* t1=p1->nxt;

Node* t2=p2->nxt;

p1->nxt=t2;

p2->nxt=t1;

Node* tmp=t1->nxt;

t1->nxt=t2->nxt;

t2->nxt=tmp;

return true;

}

void JoseLoop(Node* Head,int n,int k,int s){

Node* S=Head;

Node* p=Head;

for(int i=0;i

S=S->nxt;

p=S->nxt;

if(k==1){

for(int i=1;i

cout<data<<" ";

p=p->nxt;

}

}

else{

while(p->nxt!=p){

for(int i=1;i

S=p;

p=p->nxt;

}

cout<data<<" ";

S->nxt=p->nxt;

p=p->nxt;

}

}

cout<data<<" "<<'\n';

}

int main(){

int n,k,s;

while(cin>>n>>k>>s){

int* a=new int[n+1];

for(int i=1;i<=n;i++)

a[i]=i;

Node* Head=new Node;

Head->nxt=NULL;

Head->data=0;

createList(Head,a,n);

JoseLoop(Head,n,k,s);

}

return 0;

}

F. DS链表—学生宿舍管理(双向列表容器List)

#include

#include

#include

#include

using namespace std;

int main(){

listroom;

listFree;

unordered_mapbk;

unordered_maprtop;

unordered_mapptor;

int n,m;

cin>>n;

for(int i=1;i<=n;i++){

string a;

int b;

cin>>a>>b;

room.push_back(b);

bk[b]++;

rtop[b]=a;

ptor[a]=b;

}

for(int i=101;i<=120;i++)

if(!bk[i])

Free.push_back(i);

cin>>m;

while(m--){

string a;

cin>>a;

if(a[0]=='a'){

string b;

cin>>b;

for(int i=101;i<=120;i++)

if(!bk[i]){

bk[i]++;

int num=Free.front();

Free.pop_front();

ptor[b]=num;

rtop[num]=b;

room.push_front(num);

break;

}

}

else if(a[0]=='r'){

int b;

cin>>b;

auto it=find(room.begin(),room.end(),b);

room.erase(it);

// for(auto t:room) cout<

// cout<

Free.push_back(b);

}

else if(a=="display_used"){

room.sort();

int tmp=room.front();

cout<

room.pop_front();

for(auto t:room){

cout<<"-"<

}

cout<

room.push_front(tmp);

}

else{

int tmp=Free.front();

cout<

Free.pop_front();

for(auto t:Free)

cout<<'-'<

Free.push_front(tmp);

}

}

return 0;

}

#include

using namespace std;

template

class Node{

public:

T data;

Node* nxt;

};

template

class Stack{

public:

int MAX_size;

int Cur_size;

Node* Top;

void Stack_Init(int x){

MAX_size=x;

Top=new Node;

Top->nxt=NULL;

Cur_size=0;

}

void push(T x){

if(Cur_size>MAX_size){

puts("error");

return;

}

Node* t=new Node;

t->data=x;

t->nxt=Top;

Top=t;

Cur_size++;

}

int size(){

return Cur_size;

}

void pop(){

if(Cur_size==0){

puts("error");

return;

}

Top=Top->nxt;

Cur_size--;

}

T top(){

if(Cur_size==0){

puts("error");

return -1;

}

return Top->data;

}

};

int main(){

Stack s;

s.Stack_Init(10);

for(int i=1;i<=5;i++)

s.push(i);

cout<

for(int i=1;i<=2;i++)

s.pop();

cout<

cout<

for(int i=1;i<=5;i++){

cout<

s.pop();

}

return 0;

}

柚子快报邀请码778899分享:html 【数据结构】链表

http://yzkb.51969.com/

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。