链表的构建事实上也就是不断插入节点的过程。而节点的插入能够分为头插法和尾插法。

头插法就是在头结点后插入该节点,始终把该节点作为第一个节点。尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点。假设想要了解链表的概念和其它链表操作。请參考《数据结构与算法之链表》《C语言实现链表的基本操作》两篇文章。演示样例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert

//
// main.c
// HeadInsertAndTailInsert
//
// Created by chenyufeng on 16/2/25.
// Copyright © 2016年 chenyufengweb. All rights reserved.
// /**
* 分别使用头插法和尾插法建立单链表
*/ #include <stdio.h>
#include "stdlib.h"
#include "string.h" typedef int elemType;
//构造节点
typedef struct ListNode{
int element;
struct ListNode *next;
}Node; //初始化链表
void initList(Node *pNode){ pNode = NULL;
printf("%s函数运行,头结点初始化完毕\n",__FUNCTION__);
} //打印链表
void printList(Node *pNode){
if (pNode == NULL) {
printf("%s函数运行,链表为空,打印失败\n",__FUNCTION__);
}else{
while (pNode != NULL) {
printf("%d ",pNode->element);
pNode = pNode->next;
}
printf("\n");
}
} //头插法
Node *HeadInsert(Node *pNode){ Node *pInsert;
pInsert = (Node*)malloc(sizeof(Node));
if (pInsert == NULL) {
printf("%s函数运行。内存分配失败,建立链表失败\n",__FUNCTION__);
return NULL;
} memset(pInsert, 0, sizeof(Node));
scanf("%d",&(pInsert->element));
pInsert->next = NULL; if (pInsert->element <= 0) {
printf("%s函数运行。输入数据有误,建立链表失败\n",__FUNCTION__);
return NULL;
} while (pInsert->element > 0) { if (pNode == NULL) {
pNode = pInsert;
}else{
//注意以下语句的顺序,否则可能造成链断裂
pInsert->next = pNode;
pNode = pInsert;
} pInsert = (Node*)malloc(sizeof(Node));
if (pInsert == NULL) {
printf("%s函数运行,内存分配失败,建立链表失败\n",__FUNCTION__);
return NULL;
} memset(pInsert, 0, sizeof(Node));
scanf("%d",&(pInsert->element));
pInsert->next = NULL;
} printf("%s函数运行。头插法建立链表成功\n",__FUNCTION__); return pNode;
} //尾插法
Node *TailInsert(Node *pNode){ Node *pInsert; //要插入的节点
Node *pMove; //遍历链表的节点
pInsert = (Node*)malloc(sizeof(Node));
if (pInsert == NULL) {
printf("%s函数运行,内存分配失败,建立链表失败\n",__FUNCTION__);
return NULL;
} memset(pInsert, 0, sizeof(Node));
scanf("%d",&(pInsert->element));
pInsert->next = NULL; if (pInsert->element <= 0) {
printf("%s函数运行。输入数据有误,建立链表失败\n",__FUNCTION__);
return NULL;
} pMove = pNode;
while (pInsert->element > 0) {
if (pNode == NULL) {
//注意不要忘了改动pMove指针的指向,初始pMove一定要指向头节点
pNode = pInsert;
pMove = pNode;
}else{
//遍历找到最后一个节点
while (pMove->next != NULL) {
pMove = pMove->next;
}
pMove->next = pInsert;
} pInsert = (Node*)malloc(sizeof(Node));
if (pInsert == NULL) {
printf("%s函数运行。内存分配失败,建立链表失败\n",__FUNCTION__);
return NULL;
} memset(pInsert, 0, sizeof(Node));
scanf("%d",&(pInsert->element));
pInsert->next = NULL;
} printf("%s函数运行,尾插法建立链表成功\n",__FUNCTION__); return pNode;
} int main(int argc, const char * argv[]) { Node *pList; initList(pList);
printList(pList); //头插法建立链表
pList = HeadInsert(pList);
printList(pList); //尾插法建立链表
pList = TailInsert(pList);
printList(pList); return 0;
}

C实现头插法和尾插法来构建单链表(不带头结点)的更多相关文章

  1. C实现头插法和尾插法来构建单链表(带头结点)

    我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天 ...

  2. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  3. Java解释单链表中的头插法以及尾插法

    单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释. 首先定义好链表中的节点类: 其中,data代表节点所存放的数据,next代表指向下一节点 对于单 ...

  4. 如何用尾插法建立双链表(C语言,非循环)

    如何用尾插法建立双链表 其实本来是想完成汪队给的链表快排的作业,但是我写完建立双链表以后就12点了龟龟,明天还要早起QAQ,我菜死了 一,为啥要有双链表 先说单链表吧单链表长这样 他的一个结点结构就是 ...

  5. LinkedList 利用的是尾插法

  6. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  7. 尾插法-实现链表反转(有点bug,以后再来研究下)

    def func2(head): p = head.next while p.next: q = p.next p.next = q.next # 重点 head.next = q q.next = ...

  8. HashMap 链表插入方式 → 头插为何改成尾插 ?

    开心一刻 一天,楼主在路上碰到了一个很久没见的朋友,找了个餐馆,坐下聊了起来 楼主:在哪上班了 ? 朋友:火葬场啊 楼主:在那上班,一个月多少钱啊 ? 朋友:两万多啊 楼主(不可思议):多少 ? 朋友 ...

  9. 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序

    [题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...

随机推荐

  1. [题解] cogs 2240 架设电话线路

    http://cogs.pro:8080/cogs/problem/problem.php?pid=2240 与洛谷P2885几乎一致,https://www.luogu.org/problemnew ...

  2. DNS域名系统

    1. 什么是DNS? DNS是域名系统的缩写,DNS通过将域名与实际的Web服务器连接来帮助引导Internet上的流量.从本质上讲,它需要一个人性化的请求 – 像simcf.cc这样的域名 – 并将 ...

  3. mysql 删除恢复

    一.模拟误删除数据表的恢复 1 二进制日志功能启用 vim /etc/my.cnf [mysqld] log-bin 2  完全备份 mysqldump -A -F --master-data=2 - ...

  4. linux网络原理

    1.ipconfig命令使用 显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址. 某一块网卡信息 打开或者关闭某一块网卡 2.ifup和ifdown ifup和ifdown分别是加载网卡信息 ...

  5. playbacktask

    / ** 播放应用程序的头文件. 此文件是头文件,用于定义Playback应用程序的API和数据类型. @file PlaybackTsk.h @ingroup mIAPPPlay @note什么都没 ...

  6. cs229_part1

    开篇题 这个系列的文章主要参考cs229课程的内容,按照自己的思路和其他课程与书籍方式梳理下来,可能顺序和内容都与cs229有点不一样,但是参考内容我都会附在最后.而且这个系列主要讲个人的理解不想太多 ...

  7. 洛谷 P1156 垃圾陷阱 谈论剪枝,非满分

    这是一个91分的非dp代码(是我太弱) 剪枝八五个(实际上根本没那么多,主要是上课装逼,没想到他们dp水过去了),不过我的思路与dp不同: 1.层数到达i+1,return 这个必须有 2.当前剩余生 ...

  8. Java基础学习总结(90)——Java单元测试技巧

    测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运.良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机. 虽然有三种主要类型的软件测试:单元测试,功 ...

  9. linux shell管道和xargs的区别

    如上图,加了xargs的话相当于将上一个操作的结果作为命令执行前的操作,不加的话直接先把后面的命令运行一遍再操作

  10. Leetcode 239.滑动窗口最大值

    滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: ...