#include<iostream>
using namespace std;
const int M=30;
typedef struct node
{
char name[M];
int score;
struct node *next;
}node,*linklist;
linklist L;
linklist initlinklist(linklist &L)//初始化
{
L=(linklist)malloc(sizeof(node));
L->next=NULL;
return L;
}
void Creatlinklist(linklist &L)//建立链表
{
initlinklist(L);
node *s,*r=L;//s是新来的
char a[M];//name
int x;//score
cin>>a>>x;
while(x!=0)
{
s=(linklist)malloc(sizeof(node));
strcpy(s->name,a);
s->score=x;
r->next=s;
r=s;
cin>>a>>x;
}
if(r)
r->next=NULL;
}
void bianli(linklist &L)//遍历链表
{
node *p=L->next;
while(p)
{
cout<<p->name<<" "<<p->score<<endl;
p=p->next;
}
}
linklist get(linklist L,int i)//查找
{
node *p=L;
int j=0;
while(p->next && j<i)
{
p=p->next;
j++;
}
if(j==i)
{
//cout<<p->name<<" "<<p->score<<endl;
return p;
}
else
{
cout<<"找不到"<<endl;
return NULL;
}
}
int deletelinklist(linklist L,int x)//删除值为x的结点
{
linklist s,p=L;
while(p->next->score!=x)
p=p->next;
if(!p)
{
cout<<"找不到"<<endl;
return -1;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}
int deletelinklist2(linklist L,int i)//删除第i个结点
{
linklist s,p;
p=get(L,i-1);
if(!p)
{
cout<<"找不到第i-1个结点"<<endl;
return -1;
}
else
if(!p->next)
{
cout<<"找不到第i个结点"<<endl;
return -1;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}
int insert(linklist &L,int i,char a[],int x)//在第i个位置上插入
{
node *p,*s;
p=get(L,i-1);
if(!p)
{
cout<<"参数错误"<<endl;
return -1;
}
else
{
s=(linklist)malloc(sizeof(node));
strcpy( s->name,a);
s->score=x;
s->next=p->next;
p->next=s;
return 1;
}
}
int main()
{
int x,i;
linklist L;
Creatlinklist(L);
bianli(L);
/* cin>>x;
deletelinklist(L,x);
cout<<"删除后"<<endl;
bianli(L);//删除后再遍历
cin>>i;
deletelinklist2(L,i);
cout<<"删除后"<<endl;
bianli(L);//删除后再遍历
/*cin>>i;
cout<<"查找结果\n";
get(L,i);
int j,zhi;
cout<<endl;
cin>>j>>a>>zhi;
insert(L,j,a,zhi);
cout<<"插入后"<<endl;
bianli(L);//插入后再遍历*/
return 0;
}
C++ 单链表的操作