链表,创建,删除,插入,反转,排序

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define false 0
#define true 1

typedef struct node{
	int data;
	struct node * next;
}NODE,* PNODE;

PNODE create_list(int);   //创建链表返回一个头节点
void  print_list(PNODE);  //打印链表
int isEmpty(PNODE);		  //判断链表是否为空
PNODE revers(PNODE);	  //反转链表
void revers2(PNODE);	  //反转链表
void revers3(PNODE);	  //反转链表
void  delete(PNODE,int);
void  insert(PNODE,int,int);
void  sort(PNODE);
int main(){
	PNODE head=create_list(5);
	printf("--------print------------\n");
	print_list(head);
	printf("--------inverse------------\n");
	revers2(head);
	print_list(head);
	printf("--------delete------------\n");
	delete(head,2);
	print_list(head);
	printf("--------insert------------\n");
	insert(head,2,55);
	print_list(head);
	printf("--------sort------------\n");
	sort(head);
	print_list(head);


	return 0;
}

//插入节点
void insert(PNODE head,int pos,int val){
	PNODE p=head;
	int i;
	for(i=0; i< pos-1 && NULL!=p;p=p->next,i++); //要插入位置的上个节点
	if(i>pos-1||p==NULL)
		return;
	PNODE newNode=(PNODE)malloc(sizeof(NODE));
	newNode->data=val; 
	newNode->next=p->next; //新节点next指向上个节点next
	p->next=newNode;	   //上个节点next指向新节点	
}

//删除节点
void  delete(PNODE head,int pos){
	PNODE p=head;
	int i;
	for(i=0; i<pos-1 && NULL!=p;p=p->next,i++);//删除节点上一个节点
	if(i>pos-1 || p==NULL)
		return;
	PNODE del=p->next;
	p->next=del->next;
	free(del);
}
//排序
void sort(PNODE head){
	PNODE p=head,q=head,tmp;
	int t;
	for(p=p->next;NULL!=p->next;p=p->next){
		tmp=p;
		for(q=p->next;NULL!=q;q=q->next){
			if(tmp->data>q->data){
				tmp=q;
			}
		}
		if(tmp!=p){
			t=p->data;
			p->data=tmp->data;
			tmp->data=t;
		}
	}
}
//反转链表
PNODE revers(PNODE head){
	PNODE pre=NULL,nex,cur=head->next; 
	while(cur!=NULL){
		nex=cur->next; //保存 当前节点的下个节点
		cur->next=pre; //重新指向当前next为上个节点
		pre=cur;	   //上个节点指向当前节点
		cur=nex;	   //当前节点指向下个节点	
	}
	head->next=pre;
	return head;
}

PNODE revers3(PNODE head){
	PNODE q = 0, t;
	for (; head; t = head->next, head->next = q, q = head, head = t);
}

PNODE revers2(PNODE head){

	PNODE *prev = 0, *next;
	while (head) {
		next = head->next;
		head->next = prev;
		prev = head;
		head = next;
	}
	head = prev;
}

//创建头节点并返回头节点地址
PNODE create_list(int len){
	int i,val[]={2,-1,0,33,125,-8};  //测试数据
	PNODE head=(PNODE)malloc(sizeof(NODE));
	if(head==NULL){
		printf("申请内存失败.");	
		exit(-1);
	}
	PNODE tail=head;
	head->next=NULL;
	for(i=0;i<len;i++){
		PNODE newNode=(PNODE)malloc(sizeof(NODE));
		newNode->data=val[i];
		newNode->next=NULL;
		tail->next=newNode;  //上个节点next指向本节点
		tail=newNode;		 //保存本节点
	}
	return head;
}

//打印链表
void  print_list(PNODE head){
	PNODE p=head->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

//判断链表是否为空
int isEmpty(PNODE head){
	if(head==NULL || head->next==NULL){
		return true;
	}else{
		return false;
	}
}

  

posted on 2013-06-21 17:25  Jw.snow  阅读(247)  评论(0编辑  收藏  举报

导航