单链表总结,适用于平时复习,或者板子,综合了信息学竞赛写法和考研数据结构写法
#include <iostream>
#include<cstdlib>
using namespace std;
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*linklist;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int x;
Lnode* getelem2(Lnode *l,int i);
void insertnext(linklist &l,int i,int e){
Lnode *p;
p=getelem2(l,i-1);
Lnode *s;
s=new Lnode;
s->next=p->next;
p->next=s;
s->data=e;
l->data+=1;
}
bool getelem1(Lnode *l,int i,int &e){
Lnode *p;
int j;
p=l->next;
j=1;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(p!=NULL&&i==j){
e=p->data;
return true;
}
else
return false;
}
//返回指向第i个位置的指针
Lnode* getelem2(Lnode *l,int i){ //这种可以直接return
Lnode *p,*r;
p=l->next;
int j=1;
while((p->next!=NULL)&&(j<i)){
p=p->next;
j++;
}
if(p!=NULL&&j==i){
return p;
}
}
void printlinklist(Lnode *l){
Lnode *s;
s=l->next;
while(s!=NULL){
cout<<s->data<<" ";
s=s->next;
}
}
void deleteLnode(Lnode *l,int i){
Lnode *p,*s;
if(i>1){
p=getelem2(l,i-1);
s=p->next;
p->next=s->next;
l->data-=1;
free(s);
}
if(i==1){
p=l->next;
l->next=p->next;
l->data-=1;
}
}
int main(int argc, char** argv) {
linklist l;
Lnode *p,*r;
l=new Lnode;
l->data=0;
cin>>x;
r=l;
while(x!=-1){
p=new Lnode;
r->next=p;
r=p;
p->data=x;
p->next=NULL;
l->data+=1;
cin>>x;
}
printlinklist(l);cout<<" "<<l->data;
insertnext(l,3,999);
cout<<endl;
printlinklist(l);
cout<<" "<<l->data;
cout<<endl;
deleteLnode(l,1);
printlinklist(l);cout<<" "<<l->data;
return 0;
}