数据结构C语言-不带头结点的单链表头插法/尾插法创建

最近有点忙,今天才开始看数据结构单链表的部分,由于考研,看了《王道复习指导书》上只讲了带头结点的单链表操作,只是文末提了下不带头节点的什么情况,在此结合王道复习书,电脑上写了运行了下不带头结点的。

//
// Created by gxj on 2021/3/30.
//
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;

//单链表结构体,LNode表示结点,LinkList表示链表,其实两者一样的,只是表示不同
typedef struct LNode {
    ElementType data;
    struct LNode *next;
} LNode, *LinkList;

//不带头节点头插法
void NoNode_HeadInsert(LinkList *L) {
    //初始化链表
    LNode *s;//要插入的节点
    ElementType x;//要插入的元素
    scanf("%d", &x);
    while (x != 999) {
        s = (LNode *) calloc(1, sizeof(LNode));
        s->data = x;
        s->next = NULL;
        if (NULL == *L) {
            *L = s;//将新结点置位首节点也是尾结点
        } else {
            s->next = *L;
            *L = s;//新结点置位尾结点
        }
        scanf("%d", &x);
    }
}

//不带头节点尾插法
void NoNode_TailInsert(LinkList *L) {
    ElementType x;//要插入的元素
    LNode *s;//要插入的节点
    LNode *r;//尾指针
    scanf("%d", &x);
    while (x != 999) {
        s = (LNode *) calloc(1, sizeof(LNode));
        s->data = x;
        s->next = NULL;
        //链表是否为空
        if (NULL == *L) {
            *L = s;//将新结点置位首节点也是尾结点
            r = *L;
        } else {
            r->next = s;
            r = s;//新结点置位尾结点
        }
        scanf("%d", &x);
    }
}

//链表输出
void NoNode_Print(LinkList L) {
    while (L) {
        printf("%3d", L->data);
        L = L->next;
    }
    printf("\n");
    fflush(stdout);
}

//链表逆置
LinkList reverse_LinkList(LinkList L){
    LinkList newList = NULL;
    LNode *s;
    while(L){
        s = (LNode *) calloc(1, sizeof(LNode));
        s->data = L->data;
        s->next = NULL;
        if (NULL == newList) {
            newList = s;//将新结点置位首节点也是尾结点
        } else {
            s->next = newList;
            newList = s;//新结点置位尾结点
        }
        L = L->next;
    }
    return newList;
}

int main() {
    LinkList L = NULL;//空链表初始化
//    NoNode_HeadInsert(&L);//不带头节点头插法
    NoNode_TailInsert(&L);//不带头结点尾插法
    NoNode_Print(L);//链表打印
    LinkList newList = reverse_LinkList(L);//链表逆置
    NoNode_Print(newList);//链表逆置后打印
    return 1;
}

效果如下:

头插法(看图皆可以看出头插法他有链表的逆反的作用)

尾插法

单链表借助新的链表的逆置

好的,我可以回答这个问题。不带头结点实现尾插法建立单链表的思路是先定义一个指针变量,该指针变量指向链表的第一个节点。然后依次读入各个节点的数据,创建节点,并将该节点插入到链表的尾部。 具体流程如下: 1. 定义一个指针变量 p,初始化为 NULL。 2. 读入第一个节点的值,创建该节点,并将 p 指向该节点。 3. 读入下一个节点的值,创建该节点,并将 p->next 指向该节点。 4. 将 p 指向新创建的节点。 5. 重复第 3 步和第 4 步,直到读入所有节点的值。 6. 将 p 的 next 指针设置为 NULL,表示链表的结尾。 下面是具体的代码实现: ``` #include <iostream> using namespace std; struct Node { int data; Node *next; }; int main() { Node *p = NULL; // 定义指针变量 p,初始化为 NULL int value; cin >> value; // 读入第一个节点的值 while(value != -1) { Node *node = new Node; // 创建新节点 node->data = value; // 设置新节点的数据 node->next = NULL; // 将新节点的 next 指针设置为 NULL if(p == NULL) { // 第一个节点特殊处理 p = node; } else { // 链表已存在 Node *tmp = p; // 定义临时指针变量 while(tmp->next != NULL) { // 找到链表最后一个节点 tmp = tmp->next; } tmp->next = node; // 将新节点插入到链表的尾部 } cin >> value; // 读入下一个节点的值 } // 输出链表中的数据 Node *tmp = p; while(tmp != NULL) { cout << tmp->data << " "; tmp = tmp->next; } cout << endl; return 0; } ``` 希望能帮到你。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值