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

本文介绍了一个简单的链表数据结构,并提供了多种链表操作方法,包括插入、查找、反转、选择排序等。通过实例演示了如何使用这些方法进行链表元素的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值