链表的各种操作

来源:互联网 发布:淘宝里的企业店铺好吗 编辑:程序博客网 时间:2024/05/01 18:46

链表的各种操作

typedef struct lnode {
elem data;
struct lnode *next;
}lnode ,*linklist;
//建立一个链式表 向表中加入数据
status listset(linklist &head){
int n=0;
elem x=2;
linklist p1,p2;
p2=p1=(linklist)malloc(sizeof(lnode));
p1->next=NULL;
while(x){
++n;
if(n==1)
head=p1;
else {
cin>>x;
if(x!=0){
p1=p2;
p2=(linklist)malloc(sizeof(lnode));
p2->data=x;
p1->next=p2;}}
}
p2->next=NULL;
return OK;
}// 返回链式表的长度
int listlength(linklist head){
linklist p;
int i=0;
p=head;
while(p->next!=NULL)
{ i++; p=p->next; }
return i;
}//在第i个位置插入一个元素
status listinsert(linklist &head,int i,linklist L){
linklist p1,p2;
p1=p2=head;
if(i<1) exit(OVERFLOW);
else if(i==1){
L->next=head->next;head->next=L;
}
else if(i==listlength(head)){
for(int j=1;j<=listlength(head);j++)
p1=p1->next;
p1->next=L;
L->next=NULL;}
else {
for(int j=0;j<i;j++){
p1=p2;
p2=p2->next;}
p1->next=L;
L->next=p2;}
return OK;
}//删除第i个位置上的元素
status listdelete(linklist &head,int i){
int j;
linklist p1,p2;
p1=p2=head;
if(i==1)
head=p1->next;
else if(i==listlength(head)){
for(j=0;j<listlength(head)-1;j++)
p1=p1->next;
p1->next=NULL;}
else {
for(j=0;j<i;j++){
p2=p1;
p1=p1->next;}
p2->next=p1->next;}
return OK;
}//查找链式表中是否存在元素e,并返回他的位置
status locateElemType(linklist head,elem e,int &i){
linklist p;
int j;
p=head->next;
for(j=1;j<=listlength(head);j++)
if(p->data!=e)
p=p->next;
else {
return i=j;
break;}
return OK;
}//从小到大排序
status order(linklist &head){
if(!head) return ERROR;
elem temp;
linklist p1,p2;
for(int i=1;i<listlength(head);i++){
p1=head->next;
for(int j=0;j<listlength(head)-i;j++){
p2=p1->next;
if(p1->data>p2->data){
temp=p1->data;
p1->data=p2->data;
p2->data=temp;}
p1=p2;}
}return OK;
}//将两个有序的链式表合并为一个有序的链式表//////从小到大的顺序
status unionlist(linklist head1,linklist head2,linklist &head){
linklist p1,p2,p;
if(!head1) return ERROR;
if(!head2) return ERROR;
order(head1);order(head2);
p1=head1->next;
p2=head2->next;
p=head=head1;
while(p1&&p2){
if(p1->data<=p2->data){
p->next=p1;
p=p1;
p1=p1->next;}
else{
p->next=p2;
p=p2;
p2=p2->next;}
}
p->next=p1?p1:p2;
return OK;
}//将链式表逆置
status reserve(linklist &head,linklist &p){
linklist p1,r;p1=head->next;
while(p1){r=p1;
p1=p1->next;
r->next=p->next;
p->next=r;
}return OK;
}//将两个链式表连接起来
status link(linklist &head1,linklist head2){
if(!head1) return ERROR;
linklist p;
p=head1->next;
for(int i=1;i<listlength(head1);i++)
p=p->next;
if(!head2) return ERROR;
p->next=head2->next;
return OK;
} //若 k 是链表的元素 就返回它的后继元素
int nextelem(linklist head,elem k){
elem e;
if(!head) return ERROR;
linklist p;
p=head->next;
while(p->data!=k){
p=p->next;
if(!p->next)
cout<<"不存在该元素的后继元素 ";
}
if(p->next)
return e=p->next->data;
return ERROR;
}//若 k 是链表的元素 就返回它的前驱元素
status priorelem(linklist head,elem k,elem &e){
if(!head) return ERROR;
linklist p1,p2;
p1=head->next;
if(p1->data==k){cout<<"不存在该元素的前驱 "; e=0;
return ERROR;}
while(p1->data!=k){
p2=p1;
p1=p1->next;
if(!p1)
return ERROR;}
e=p2->data;
return OK;
}//输出链式表中的元素
void print(linklist head) //输出链式表中的元素
{
linklist p;
p=head->next;
if(head!=NULL)
do{
cout<<p->data<<" ";
p=p->next;
}while(p!=NULL);
cout<<endl;
}
void MenuList(){
cout<<"****************链式表的操作****************"<<endl;
cout<<"NO.0 退出操作"<<endl;
cout<<"NO.1 输出链式表"<<endl;
cout<<"NO.2 返回链式表的长度"<<endl;
cout<<"NO.3 向链表中插入一个元素"<<endl;
cout<<"NO.4 在链表中删除一个元素"<<endl;
cout<<"NO.5 查找链表中出某个元素"<<endl;
cout<<"NO.6 查找某个元素的前驱结点"<<endl;
cout<<"NO.7 查找某个元素的后继结点"<<endl;
cout<<"NO.8 将链式表从小到大出顺序排序"<<endl;
cout<<"NO.9 将链式表逆置"<<endl;
cout<<"NO.10 将两个有序的链式表连成一个链师表"<<endl;
}
void main(){
MenuList();
int value,position;
linklist p=(linklist)malloc(sizeof(linklist));p->next=NULL;
cout<<"建立一个链式表,请输入元素以零结束:"<<endl;
int choice;
linklist L;listset(L);print(L);
cout<<"☆☆☆☆☆☆☆☆☆请选择操作☆☆☆☆☆☆☆☆☆:";
cin>>choice;
switch(choice){
case 1: print(L);break;
case 2: value=listlength(L);cout<<value<<endl;break;
case 3: cout<<"请输入要插入的关键字和位置:";cin>>value>>position;p->data=value;
listinsert(L,position,p);print(L);break;
case 4: cout<<"输入要删除的元素的位置: ";cin>>position;
listdelete(L,position);print(L);break;
case 5: cout<<"输入要查找元素的关键字: ";cin>>value;
locateElemType(L,value,position);cout<<position<<endl;break;
case 6: cout<<"查找前驱 输入关键字:";cin>>value;
priorelem(L,value,position);cout<<position<<endl;break;
case 7: cout<<"查找后继 输入关键字:";cin>>value;
cout<<nextelem(L,value)<<endl;break;
case 8: order(L);print(L);break;
case 9: reserve(L,p);print(p); break;
case 10:cout<<"请再建立一个链表: "<<endl;linklist L1,L0;listset(L1);
unionlist(L,L1,L0);print(L0);break;
case 0:return ;
}
}

 

原创粉丝点击