2012年(106)
分类: C/C++
2012-05-07 16:39:36
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;jp1=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
p1->next=NULL;}
else {
for(j=0;jp2=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
for(int j=0;j
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
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=p->next;
}while(p!=NULL);
cout<
void MenuList(){
cout<<"****************链式表的操作****************"<
void main(){
MenuList();
int value,position;
linklist p=(linklist)malloc(sizeof(linklist));p->next=NULL;
cout<<"建立一个链式表,请输入元素以零结束:"<
linklist L;listset(L);print(L);
cout<<"☆☆☆☆☆☆☆☆☆请选择操作☆☆☆☆☆☆☆☆☆:";
cin>>choice;
switch(choice){
case 1: print(L);break;
case 2: value=listlength(L);cout<
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<
priorelem(L,value,position);cout<
cout<
case 9: reserve(L,p);print(p); break;
case 10:cout<<"请再建立一个链表: "<
case 0:return ;
}
}