数据结构与算法系列---单链表

链表的实现及对它的一些操作: 

 

#include  < malloc.h >
#define  ERROR 2
#define  OK 1

typedef 
int  ElemType;
typedef 
struct  LNode
{
    ElemType data;
    
struct LNode *next;
}
 LNode, * LinkList;

// 初始化
LinkList ListInit()
{

    LNode 
*base=(LinkList)malloc(sizeof(LNode));
    
base->data=0;
    
base->next=NULL;
    
return base;
}

// 插入一个元素
int  ListInsert(LinkList L, int  i,ElemType e)
{
    LNode 
*p,*s;
    
int j=0;
    p
=(LNode *)L;
    
while(p&&j<i-1)
    
{
        p
=p->next;
        
++j;
    }

    
if(!p||j>i-1)
        
return ERROR;
    s
=(LNode *)malloc(sizeof(LNode));
    s
->data=e;
    s
->next=p->next;
    p
->next=s;
    
return OK;
}

// 查找一个元素
int  GetElem(LinkList L, int  i,ElemType  * e)
{
    LNode 
*p;
    
int j=1;
    p
=(LNode *)L->next;
    
while(p&&j<i)
    
{
        p
=p->next;
        
++j;
    }

    
if(!p||j>i)
        
return ERROR;
    
*e=p->data;
    
return OK;
}

// 倒置顺序
void  Reverse_List(LNode  * head)
{
    LNode 
*p=head->next,*q;
    head
->next=NULL;
    
while(p)
    
{
        q
=p->next;
        p
->next=head->next;
        head
->next=p;
        p
=q;
    }

}

// 把最小的元素移到表首
void  MoveMinFirst(LinkList head)
{
    LNode 
*p,*q,*r;
    r
=head;     //r指向头结点
    p=head->next;  //p指向第一个结点
    
    
while(p->next)
    
{
        
if(p->next->data<r->next->data)
            r
=p;
        p
=p->next;
    }


    
if(r->next!=head->next)             //不只一个元素
    {
        q
=r->next;
        r
->next=q->next;
        q
->next=head->next;
        head
->next=q;
    }

    
}

// 求最大值(递归算法)
int  GetMaxValue(LinkList head)
{
    
int temp;
    
if(!head->next)
        
return head->data;
    
else
    
{
        temp
=GetMaxValue(head->next);
        
if(head->data>=temp)
            
return head->data;
        
else
            
return temp;
    }

}

// 选择排序
void  SelectSort(LinkList L)
{
    LNode 
*p,*q,*r;
    
int temp;
    p
=L->next;
    
while(p)
    
{
        q
=p->next;
        r
=p;      //r指向最小的结点
        while(q)
        
{
            
if(q->data<r->data)
                r
=q;
            q
=q->next;
        }

        
if(r!=p)
        
{
            temp
=p->data;
            p
->data=r->data;
            r
->data=temp;
        }

        p
=p->next;   //p指向已排序的尾部
    }

}

// 顺序输出
void  Display(LinkList L)
{
    LNode 
*p=L->next;
    
while(p)
    
{

        printf(
"%d ,",p->data);
        p
=p->next;    
    }

}


// 倒序输出
void  Reverse_OutPut(LNode  * head)
{
    
if(head)
    
{
        Reverse_OutPut(head
->next);
        printf(
"%d ,",head->data);
    }

}

int  main( int  argc,  char *  argv[])
{
    
int a;
    LinkList La;
    La
=ListInit();
    ListInsert(La,
17);
    ListInsert(La,
29);
    ListInsert(La,
36);
    ListInsert(La,
43);
    ListInsert(La,
511);
    
    Display(La);

    printf(
" ");
    Reverse_OutPut(La
->next);
    printf(
" ");
    Display(La);
    
    Reverse_List(La);
    printf(
"  after reverse... ");
    Display(La);

    SelectSort(La);
    printf(
"  after sort! ");
    Display(La);

    printf(
"  max value is:%d ",GetMaxValue(La->next));
    printf(
"  after move! ");
    MoveMinFirst(La);
    Display(La);

    GetElem(La,
3,&a);
    printf(
"a=%d",a);

    
return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值