#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;
}
}