基础学习第二弹

关键算法和数据结构

单链表

  1. 线性表:逻辑上相邻,物理上也相邻。
  2. 单链表:
    数据域+指针域
    如要操作链表,需要声明额外的指针。

单链表的创建算法

定义一个链表结点
typedef struct node
{
    int num;
    struct node *next;
}stud;
算法如下:
#include <malloc.h>
typedef struct node
{
    int num;                 //数据域
    struct node *next;       //指针域
}stud;

stud * create(int n)         //创建n个结点
{   
    stud *head,*p1,*p2;     //p1指向新结点,p2指向当前结点
    head=p1=p2=NULL;
    for(int =0;i<n;i++)
    {
        p1=(stud *)malloc(sizeof(stud)); //创建新结点
        p1->num=i;
        if(i==0)
            head=p1;
        else
            {
            p2->next=p1;
            }
        p2=p1;
    }
    p2->next=NULL;                 //最后一个节点指向NULL
    return head;
}

单链表的查找算法

外部传入一个head指针
typedef struct node
{
    int num;
    struct node *next;
}stud;

stud * find(stud *head,int i)
{
    stud *p1;  //遍历的指针
    p1=head;
    while(p1!=NULL) //链表非空
    {
        if(i==p1->num)
            break;
        else
            {
            p1=p1->next;
            if(p1==NULL)
                {
                printf("cannot find!\n");
                return NULL;
                }
            }
    }

    return p1;
}

单链表的删除算法

与查找思路差不多,但要注意head结点和找不到删除节点的情况
bool del(stud *head,int i)  //删除成功返回true,失败或未找到返回false
{
    bool bret=false;
    if(head)
    {
        stud *p1,*p2;
        p1=head;
        while(p1->num!=i&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }   
        if(p1)
        {
            if(p1==head)      //head结点情况处理方式不同
                head=p1->next;
            else
                p2->next=p1->next;
            bret=ture;
            free(p1);
        }
    }
    return bret;
}

单链表的插入算法

前提链表有序
stud *insert(stud *head ,stud *p)
{
    stud *p1,*p2;
    p1=head;
    if(!head)
    {
        head=p;
        head->next=NULL;
    }
    else
    {
        while(p->num > p1->num && p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(p1==head)          //注意点
        {
            head=p;
            p->next=p1;
        }
        else
        {
        p2->next=p;
        p->next=p1;
        }
    }
}

待续。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值