尾插法

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;      
}

运行结果:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐