您的位置:首页
C实现头插法和尾插法来构建单链表(不带头结点)
2017-07-14 08:49
441 查看
链表的构建事实上也就是不断插入节点的过程。而节点的插入能够分为头插法和尾插法。
头插法就是在头结点后插入该节点,始终把该节点作为第一个节点。尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点。假设想要了解链表的概念和其它链表操作。请參考《数据结构与算法之链表》《C语言实现链表的基本操作》两篇文章。演示样例代码上传至 https://github.com/chenyufeng1991/HeadInsertAndTailInsert 。
头插法就是在头结点后插入该节点,始终把该节点作为第一个节点。尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点。假设想要了解链表的概念和其它链表操作。请參考《数据结构与算法之链表》《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实现头插法和尾插法来构建单链表(带头结点)
- C实现头插法和尾插法来构建非循环双链表(不带头结点)
- C实现头插法和尾插法来构建单链表(带头结点)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 带头结点的链表尾插法C++实现
- C实现头插法和尾插法来构建双向非循环链表(带头结点尾结点)
- 建立带头结点的双向链表_尾插法
- 单链表、带头结点的单链表、循环单链表 以及其操作实现
- 带头结点的单链表实现就地逆置的更优方法
- 链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。 用C语言编写 用以存放输入的二进制数 建立 一个带头结点的线性链表
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 程序一:带头结点双向链表的简单实现
- 带头结点的单链表实现
- 单链表的实现(带头结点)
- 带头结点和不带头结点的单链表的尾插法以及各种操作
- 不带头结点的链表头插法C++实现
- 带头结点的链表实现线性表的基本操作
- 带头结点的单链表实现(C++)
- 用C++实现数据结构二 带头结点的单链表