链表,创建,删除,插入,反转,排序
#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; } }