单向链表的逆序操作

#include <stdio.h>
#include <stdlib.h>
#define  ElemType int

typedef struct node{
	ElemType data;
	struct node *next;
}node,*link;

void display(link list);

//使用头插法
link createH(link l){
	ElemType i;
	l->next=NULL;
	link p=NULL;
	while(1){
		/*p=(link)malloc(sizeof(node));
                if (NULL == p)        
                {    
                        printf("memory out of use/n");
                        return l; 
                } */ 
		for(i=1;i<10;i++){
			p=(link)malloc(sizeof(node));
			p->data=i;
			p->next=l->next;
			l->next=p;
		} 
		break;
		/*

		if(scanf("%d",&p->data)!=EOF){
			p->next=l->next;
			l->next=p;	
		}else{
			break;
		}*/
	}
	return l;
	
	
}


link createF(link list){
        link p,k;
        list->next=NULL;
        int i;
        for(i=1;i<10;i++){
		k=list;
                p=(link)malloc(sizeof(node));
                p->data=i;
				while(k->next!=NULL){
					k=k->next;
				}
                p->next=NULL;
                k->next=p;
        }
        return list;
}

//方法一
link reverseA(link prev,link cur){
	link list=NULL;
	if(cur==NULL){
		return prev;
	}
	list=reverseA(cur,cur->next);
	cur->next=prev;
	return list;
}

//方法二
link reverseB(link p){
	if( p->next==NULL){
		return p;
	}
	link ph=reverseB(p->next);
	p->next->next=p;
	p->next=NULL;
	return ph;
}
//方法三
link reverseC(link l){
	link p=NULL,q=NULL;
	p=l->next;
	l->next=NULL;//头结点分离
	while(p!=NULL){
		q=p;
		p=p->next;
		q->next=l->next;
		l->next=q;
	}
	return l;
}
//方法四
link reverseD(link l){
	link p=NULL,q=NULL;
	if(l==NULL){
		return l;
	}
	
	p=l;
	q=p->next;
	if(q==NULL){
		return p;
	}else{
		l=reverseR(q);
	}
	
	q->next=p;
	p->next=NULL;	
	
	return l;
}

//方法五
link reverseE(link p){
        link pre=NULL,pnext=NULL,cur=p;
        while(cur!=NULL){
                pnext=cur->next;
                cur->next=pre;
                pre=cur;
                cur=pnext;
        }
        return pre;
}

//按照位置删除节点
link delete(link list,int i){
        link p=list,k=NULL;
        if(i==1){
                return list=list->next;
        }
        int j=2;
        while(p!=NULL){
                if(i==j){
                        p->next=p->next->next;
                        break;
                }
                p=p->next;
                j++;
        }
        free(p);
        return list;
}
void display(link list){
	link p=list;
	while(p!=NULL){
		printf("%4d",p->data);
		p=p->next;
	}
	printf("\n");
}


void main(){
	link list,p,r;
	list=(link)malloc(sizeof(node));
	p=(link)malloc(sizeof(node));
	r=(link)malloc(sizeof(node));
	p=createF(list);
	display(p);
	r=reverseA(NULL,p);
	display(r);
	r=reverseB(p);
	display(r);
}
	

 

你可能感兴趣的:(链表)