深入解析:408cpp学习之链表(二)

        今天我主要学习了单链表的基础操作,包括头插法,尾插法,按位查找以及按元素查找,下面我将我今天所写代码分享给大家。

1. 头插法创建链表

//头插法创建链表
#define maxsize 50
typedef int Elemtype;
typedef struct Lnode {
    Elemtype data; //数据域
    struct Lnode* next; //指针域
}Lnode,*LinkList;
void head_insert(LinkList L)
{
    Elemtype x;
    scanf("%d", &x);
    LinkList s;
    L->next = NULL; //初始化头结点的next指针为NULL
    while (x != 99999) //以99999作为输入结束标志
    {
        s = (LinkList)malloc(sizeof(Lnode)); //创建新结点
        s->data = x; //赋值数据域
        s->next = L->next; //头插法关键步骤:让新结点指向原来的第一个节点
        L->next = s; //头结点指向新结点
        scanf("%d", &x); //继续读取输入
    }
}
void PrintL(LinkList L)
{
    L = L->next; //跳过头结点
    while (L!= NULL) //遍历链表直到NULL
    {
        printf("%3d\n", L->data); //打印当前结点数据
        L = L->next; //移动到下一个结点
    }
}

2. 尾插法创建链表

//尾插法创建链表
#define maxsize 50
typedef int elemtype;
typedef struct Lnode {
    elemtype data;
    struct Lnode* next;
}Lnode,* link_list;
void tail_insert(link_list L)
{
    L->next = NULL; //初始化头结点的next指针为NULL
    elemtype x;
    scanf("%d", &x);
    link_list r = L; //r始终指向链表尾部
    link_list s;
    while (x != 99999) //以99999作为输入结束标志
    {
        s = (link_list)malloc(sizeof(Lnode)); //创建新结点
        s->data = x; //赋值数据域
        r->next = s; //尾部结点的next指向新结点
        r = r->next; //r指向新的尾部
        scanf("%d", &x); //继续读取输入
    }
    r->next = NULL; //最后将尾结点的next置为NULL
}

3. 按位置查找结点

//按位置查找链表结点
link_list Search_L(link_list L,int posi)
{
    int i = 1; //从第一个结点开始计数(头结点不算)
    while (L && i <= posi) //遍历直到找到指定位置或链表结束
    {
        L = L->next;
        i++;
    }
    return L; //返回找到的结点指针,没找到返回NULL
}

4. 按值查找结点

//按值查找链表结点
link_list search_num(link_list L, elemtype num)
{
    L = L->next; //跳过头结点
    while (L) //遍历链表
    {
        if (L->data == num) //找到匹配的值
        {
            return L; //返回结点指针
        }
        L = L->next; //继续下一个结点
    }
    return NULL; //没找到返回NULL
}

5. 在指定位置插入结点

//在链表指定位置插入结点
void insert_num(link_list L, elemtype num, elemtype posi)
{
    elemtype i = 0;
    //找到插入位置的前一个结点
    while (L && posi && i < posi - 1)
    {
        L = L->next;
        i++;
    }
    link_list s;
    s = (link_list)malloc(sizeof(Lnode)); //创建新结点
    s->data = num; //赋值数据域
    s->next = L->next; //新结点指向原位置的结点
    L->next = s; //前一个结点指向新结点
}

posted @ 2025-10-23 17:54  ycfenxi  阅读(1)  评论(0)    收藏  举报