关于链表操作相关编程比较棘手,并不是说不会编,主要是每次编写都要调试很久,特别是单向链表排序,在处理链表边界时感觉很麻烦,这两天脚崴了不大方便做其他的事儿,就在宿舍编写简单程序!下面是单向链表的相关操作,包括创建、插入、删除,冒泡排序、选择排序、插入排序以及链表逆序等操作。
头文件:
#ifndef _SINGLYLINKLIST_H
#define _SINGLYLINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#ifndef BOOL_SUPPORT
#define BOOL_SUPPORT
typedef enum boolean { TRUE,FALSE } BOOL;
#endif
typedef struct _singly_link_node {
int value ;
struct _singly_link_node *next ;
}SinglyLinkNode ;
SinglyLinkNode *CreateLinkList(int* a,int len) ;
SinglyLinkNode *InsertNewNode(SinglyLinkNode *pHead,int pos,int data);
SinglyLinkNode *RemoveNode(SinglyLinkNode *pHead,int pos);
void DeleteLinkList(SinglyLinkNode *pHead);
SinglyLinkNode *ReverseLinkList(SinglyLinkNode *pHead);
SinglyLinkNode *BubbleSort(SinglyLinkNode *pHead);
SinglyLinkNode *SelectSort(SinglyLinkNode *pHead) ;
SinglyLinkNode *InsertSort(SinglyLinkNode *pHead);
void PrintLinkList(SinglyLinkNode *pHead);
void PrintLinkNode(SinglyLinkNode *pHead);
void TestSinglyLink() ;
#endif
源文件:
#include "SinglyLinkList.h"
void TestSinglyLink()
{
int a[]={5,4,3,2,1} ;
SinglyLinkNode *pHead=CreateLinkList(a,sizeof(a)/sizeof(a[0]));
printf("Origin Link List:\n");
PrintLinkList(pHead);
pHead=ReverseLinkList(pHead);
printf("Reverse Link List:\n");
PrintLinkList(pHead);
pHead=InsertNewNode(pHead,0,20) ;
pHead=InsertNewNode(pHead,2,10) ;
pHead=InsertNewNode(pHead,7,30) ;
printf("Inser New Node:\n");
PrintLinkList(pHead);
printf("Origin Order:\n");
PrintLinkNode(pHead) ;
printf("Bubble Sort Process:\n");
//pHead=BubbleSort(pHead);
//pHead=SelectSort(pHead);
pHead=InsertSort(pHead);
printf("Bubble Sort Result:\n");
PrintLinkNode(pHead);
pHead=RemoveNode(pHead,0) ;
pHead=RemoveNode(pHead,1) ;
pHead=RemoveNode(pHead,5);
printf("Remove Node:\n");
PrintLinkList(pHead);
printf("Delete Link List:\n");
DeleteLinkList(pHead);
}
SinglyLinkNode *CreateLinkList(int *data,int len)
{
SinglyLinkNode *pHead=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));
SinglyLinkNode *pTmp=pHead ;
int i=0 ;
if(pHead==NULL)
{
return NULL ;
}
for(i=0;i<len-1;i++)
{
pTmp->value=data[i];
pTmp->next=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));
pTmp=pTmp->next ;
}
pTmp->value=data[len-1] ;
pTmp->next=NULL;
return pHead ;
}
void DeleteLinkList(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=pHead ;
SinglyLinkNode *pOld=pTmp ;
while(pTmp!=NULL)
{
pOld=pTmp ;
pTmp=pTmp->next ;
printf("delete node:%d\n",pOld->value);
free(pOld);
}
pHead=NULL ;
}
void PrintLinkList(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp =pHead ;
do
{
printf("NODE:%d\n",pTmp->value) ;
pTmp=pTmp->next ;
}while(pTmp!=NULL) ;
}
void PrintLinkNode(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=pHead ;
printf("Nodes:") ;
do
{
printf("%d,",pTmp->value) ;
pTmp=pTmp->next ;
}while(pTmp!=NULL) ;
printf("\n");
}
SinglyLinkNode *ReverseLinkList(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=pHead ;
if(pTmp==NULL)
{
return NULL ;
}
SinglyLinkNode *pTmp1=pTmp->next ;
if(pTmp1==NULL)
{
return pHead ;
}
SinglyLinkNode *pTmp2=pTmp1->next ;
pTmp->next=NULL ;
pTmp1->next=pTmp ;
if(pTmp2==NULL)
{
return pTmp1 ;
}
while(pTmp2->next!=NULL)
{
pTmp=pTmp1 ;
pTmp1=pTmp2 ;
pTmp2=pTmp2->next ;
pTmp1->next=pTmp ;
}
pTmp2->next=pTmp1 ;
return pTmp2 ;
}
SinglyLinkNode *InsertNewNode(SinglyLinkNode *pHead, int pos, int value)
{
SinglyLinkNode *pTmp=pHead ;
SinglyLinkNode *pTmp1=pTmp->next ;
SinglyLinkNode *pTmp2=NULL ;
if(pos==0)
{
pTmp2=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));
pTmp2->value=value ;
pTmp2->next=pHead ;
return pTmp2 ;
}
int i=1 ;
while(pTmp1!=NULL)
{
if(i==pos)
{
pTmp->next=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));
pTmp->next->value=value ;
pTmp->next->next=pTmp1 ;
break ;
}
i++ ;
pTmp=pTmp1 ;
pTmp1=pTmp1->next ;
}
if(pTmp1==NULL)
{
pTmp->next=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));
pTmp->next->value=value ;
pTmp->next->next=pTmp1 ;
}
return pHead ;
}
SinglyLinkNode *RemoveNode(SinglyLinkNode *pHead,int pos)
{
SinglyLinkNode *pTmp=pHead ;
SinglyLinkNode *pTmp1=pTmp->next ;
if(pos==0)
{
free(pTmp) ;
return pTmp1 ;
}
int i=1 ;
while(pTmp1!=NULL)
{
pTmp1=pTmp1->next ;
if(i==pos)
{
free(pTmp->next);
pTmp->next=pTmp1 ;
break ;
}
pTmp=pTmp->next ;
i++ ;
}
return pHead ;
}
SinglyLinkNode *BubbleSort(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode));//create a new node as a constant head node
SinglyLinkNode *pTmp1=NULL ;
SinglyLinkNode *pTmp2=NULL ;
SinglyLinkNode *pTmp3=NULL ;
SinglyLinkNode *pEnd=NULL ;
pTmp->next=pHead ;
while(pEnd!=pTmp->next)
{
pTmp3=pTmp ;
pTmp2=pTmp3->next ;
if(pTmp2==NULL)
{//if only one node ,return directly
break ;
}
pTmp1=pTmp2->next ;
while(pTmp1!=pEnd)
{
if(pTmp1->value>pTmp2->value)
{
pTmp2->next=pTmp1->next ;
pTmp3->next=pTmp1 ;
pTmp1->next=pTmp2 ;
}
pTmp3=pTmp3->next ;
pTmp2=pTmp3->next ;
pTmp1=pTmp2->next ;
}
if(pEnd==NULL)
{
pTmp2->next=NULL ;
}
PrintLinkNode(pTmp->next) ;
pEnd=pTmp2 ;
}
pHead=pTmp->next ;
free(pTmp) ;
return pHead ;
}
SinglyLinkNode *SelectSort(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=(SinglyLinkNode *)malloc(sizeof(SinglyLinkNode));
SinglyLinkNode *pMaxBefore=NULL ;
SinglyLinkNode *pEnd=NULL ;
SinglyLinkNode *pTmp1=NULL ;
SinglyLinkNode *pTmp2=NULL ;
pTmp->next=pHead ;
pEnd=pTmp ;
while(pEnd->next!=NULL)
{
pMaxBefore=pEnd ;
pTmp1=pEnd ;
while(pTmp1->next!=NULL)
{
if(pMaxBefore->next->value<pTmp1->next->value)
{
pMaxBefore=pTmp1 ;
}
pTmp1=pTmp1->next ;
}
pTmp2=pMaxBefore->next ;
pMaxBefore->next=pTmp2->next ;
pTmp2->next =pEnd->next ;
pEnd->next=pTmp2 ;
pEnd=pEnd->next ;
PrintLinkNode(pTmp->next);
}
pHead=pTmp->next ;
free(pTmp) ;
return pHead ;
}
SinglyLinkNode *InsertSort(SinglyLinkNode *pHead)
{
SinglyLinkNode *pTmp=(SinglyLinkNode*)malloc(sizeof(SinglyLinkNode)) ;
SinglyLinkNode *pEnd=NULL ;
SinglyLinkNode *pTmp1=NULL ;
SinglyLinkNode *pTmp2=NULL ;
pTmp->next=pHead ;
pEnd=pTmp ;
while(pEnd->next!=NULL)
{
pTmp1=pTmp ;
while(pTmp1->next!=pEnd->next)
{
if(pTmp1->next->value<pEnd->next->value)
{//if the value of pEnd node bigger than the value of pTmp1 node ,insert it
pTmp2=pEnd->next ;
pEnd->next=pTmp2->next ;
pTmp2->next=pTmp1->next ;
pTmp1->next=pTmp2 ;
break ;
}
pTmp1=pTmp1->next ;
}
PrintLinkNode(pTmp->next);
if(pTmp1->next==pEnd->next)
{//if not find bigger, insert the pEnd node to the tail
pEnd=pEnd->next ;
}
}
pHead=pTmp->next ;
free(pTmp) ;
return pHead ;
}