【数据结构】单链表尾插法

尾插法

void CreateList(LinkList& L, int n) {//尾插法
    // 正序输入 n 个数据元素,建立带头结点的单链表
    LinkList  p, q; int i;
    L = (LinkList)malloc(sizeof(LNode));
    q = L;    // 先建立一个带头结点和尾指针的单链表
    for (i = 0; i < n; ++i) {
        p = (LinkList)malloc(sizeof(LNode));
        scanf_s("%d", &p->data);    // 输入元素值
        q->next = p;   
        q = p;//指针相等的含义:两指针指向同一位置
    }  //
    q->next = NULL;       //修改尾指针
} 

逐步解析

每个新插入的结点都在其直接前驱之后,为顺序插入。最后一步q->next = NULL; 不能写成p->next = NULL.如果这么做,编译器会报错“使用了未初始化的指针p”。

代码及结果

一个很普通的尾插法和输出:

#include <stdio.h>
#include <stdlib.h>
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
typedef int Status;
typedef struct Node {
    ElemType data;
    struct Node* next;
}LNode,*LinkList;
void CreateList(LinkList& L, int n) {//尾插法
    // 正序输入 n 个数据元素,建立带头结点的单链表
    LinkList  p, q; int i;
    L = (LinkList)malloc(sizeof(LNode));
    q = L;    // 先建立一个带头结点和尾指针的单链表
    for (i = 0; i < n; ++i) {
        p = (LinkList)malloc(sizeof(LNode));
        scanf_s("%d", &p->data);    // 输入元素值
        q->next = p;   
        q = p;//指针相等的含义:两指针指向同一位置
    }  //
    q->next = NULL;       //修改尾指针
} 
void DisplayLink(LinkList L)//输出链表
{
    LinkList p;
    p = L->next;//链表名L,L也是头指针的名字,指向头结点。头结点的指针域指向第一个结点(即p->next)
    while (p != NULL)//注意一下代码的简洁易懂。p!=NULL比!(p=NULL)常用
    {
        printf("%d\n",p->data);
        p = p->next;//不能用p++,因为链表不是连续存储的
    }
}
int main(void)
{
    LinkList A;
    int m;
    printf("您要创建几位的链表\n");
    scanf_s("%d", &m);
    printf("请输入%d个元素\n",m);
    CreateList(A, m);
    printf("您已创建链表如下:\n");
    DisplayLink(A);
    return 0;
}

执行结果如下:

尾插法进阶版

键盘依次接收正整数,以0结束,用尾插法创建单链表。

0包含在链表内:

#include <stdio.h>
#include <stdlib.h>
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
typedef int Status;
typedef struct Node {
    ElemType data;
    struct Node* next;
}LNode, * LinkList;

void CreateList(LinkList& L) //尾插法
{ 
    LinkList  p, q;
    L = (LinkList)malloc(sizeof(LNode));
    q = L;   
    int j = 1;
    while (j)
    {
        p = (LinkList)malloc(sizeof(LNode));
        scanf_s("%d", &p->data);    
        j = p->data;
        q->next = p;
        q = p;
    }
    q->next = NULL;      
}
void DisplayLink(LinkList L)
{
    LinkList p;
    p = L->next;
    while (p != NULL)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
    }
int main(void)
{
    LinkList A;
    CreateList(A);
    printf("您已创建链表如下:\n");
   
    DisplayLink(A);
    return 0;
}

运行结果如下:

0不包含在链表内:

更改尾插法函数如下即可:

void CreateList(LinkList& L) //尾插法
{ 
    LinkList  p, q;
    L = (LinkList)malloc(sizeof(LNode));
    q = L;   
    int j = 1;
    while (1)
    {
        scanf_s("%d", &j);
        if (j == 0)
            break;
         p = (LinkList)malloc(sizeof(LNode));
         p->data = j;
         q->next = p;
         q = p;
    }
    q->next = NULL;      
}

运行结果:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值