单向链表

单向链表:是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。每个节点的指针域指向下一个节点,head头指针指向头节点,尾节点指针指向NULL

单向链表的定义

typedef struct node
{
    int data;         //数据域,假设为int型数据
    struct node* next;// 指向下一个节点的指针
}linkNode,*linkP;      //linkP指向节点的指针

// 链表的创建
void CreateList(linkP* H)
{
    int i = 1;
    int a;//数据域
    linkP P,r;

    r = H; // r为头结点的复制,H头结点用于遍历,r用于新节点的复制
    printf("请输入链表第%d个元素:", i);
    scanf("%d",&a);
    while(a != -1)//a==-1表示输入结束
    {
        P = (linkP)malloc(sizeof(linkNode));//申请新的节点
        P->data = a;
        r->next = P;//r->next指针指向新节点
        r = p;//r变为新节点的P的复制
        i++;
        printf("请输入链表第%d个元素:", i);
     }
    r->next = NULL;//循环结束表示在链表尾部插入数据结束,r->next下个节点为空,r这时是尾节点的复制(r永远是尾节点复制);
}

注意
1. 创建单链表是H->next = NULL;
2. H节点不能变动,所以要创建一个复制指针r,来不断创建新节点
3. 创建最后一个节点时r->next = NULL;

//查找:按序号查找
linkP GetList(linkP H, int i)
{
    int j = 0;
    link P = H;//P为头结点的复制,用于遍历
    if (i < 0) return NULL;
    while(P->next && j < i)
    {
        P = P->next;
        j++;
    }
    if (i == j) return P;//若果i == j表示以j < i循环条件不成立,此时P指向第i个节点
    else//否则就是P->next == NULL,说明i > 表长
        return NULL;
}

// 按值查找(若果存在值就返回该节点的指针,不存在就返回NULL)
linkP LocateList(linkP H, int data)
{
    linkP P = H->next;//这里不是P = H,因为头结点没用数据,P应该指向第一个节点的。
    while(P && P->data != data)
    {
        P = P->next;
    }
    return P;// 如果循环以P->data == data结束就返回指向data的指针P,否则就以链表循环结束,P == NULL,没有找到该数据
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值