数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
来源:互联网 发布:郑州用友软件总代理 编辑:程序博客网 时间:2024/05/17 08:27
链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的。在C语言中,链表是通过指针相关实现的。而单链表是链表的其中一种,关于单链表就是其节点中有数据域和只有一个指向下个节点的指针域。创建单链表的方法有两种,分别是头插法和尾插法。
所谓头插法,就是按节点的逆序方法逐渐将结点插入到链表的头部。反之尾插法就是按节点的顺序逐渐将节点插入到链表的尾部。相对来说,头插法要比尾插法算法简单,但是最后产生的链表是逆序的,即第一个输入的节点实际是链表的最后一个节点。而为了习惯,通常用尾插法来创建链表。下面的代码就是实现了头插法和尾插法。代码在Linux下调试通过。
#include <stdio.h>#include <stdlib.h>typedef struct link{char data;struct link *next;}linklist;linklist *CreateList_Front();//头插法创建单链表linklist *CreateList_End();//尾插法创建单链表void ShowLinklist(linklist *h); //输出显示链表int main(void){int choice;linklist *head;//head = (linklist*)malloc(sizeof(linklist));while(1){printf("单链表的创建\n");printf("1.使用头插法创建单链表\n");printf("2.使用尾插法创建单链表\n");printf("3.链表输出显示\n");printf("4.退出\n");printf("做出选择:\n");scanf("%d",&choice);switch(choice){//头插法case 1:head = CreateList_Front();break;//尾插法case 2:head = CreateList_End();break;//输出链表case 3:ShowLinklist(head);break;//退出程序case 4:return 0;break;default:break;}}return 1;}linklist *CreateList_Front(){linklist *head, *p;char ch;head = NULL;printf("依次输入字符数据(‘#’表示输入结束):\n");ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch;p->next = head;head = p;ch = getchar();//头插法算法简单 核心就两句p->next = head;head = p;}return head;}linklist *CreateList_End(){linklist *head, *p, *e;char ch;head = NULL;e = NULL;printf("请依次输入字符数据('#'表示输入结束):\n");ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch;if(head == NULL)//先判断输入的是不是第一个节点{head = p;}else{e->next = p;//e始终指向输入的最后一个节点}e = p;ch = getchar();}if(e != NULL)//如果链表不为空,则最后节点的下一个节点为空{e->next = NULL;}return head;//尾插法比头插法复杂一些,程序中要做两次判断,分别是判断第一个节点和最后一个节点的判断。且消耗多一个指针变量e。}void ShowLinklist(linklist *h){linklist *p;p = h;while(p != NULL){printf("%c ", p->data);p = p->next;}printf("\n");}
通过上述代码可以看出,尾插法确实比头插法复杂点,多了两个判断。但是这是可以解决的,通过添加一个头节点,此节点不存放数据域,只是存放指向下个节点的指针域就是了。这样就可以免除掉两次判断。整体也要清晰点了。下面是增加一个头节点后尾插法的实现代码:
#include <stdio.h>#include <stdlib.h>typedef struct list{char data;struct list *next;}linklist;linklist *CreateList_End();//尾插法创建链表void ShowLinklist(linklist *h);//输出显示链表int main(void){linklist *head;printf("使用尾插法创建链表(改进版)\n");printf("请依次输入字符数据(‘#’表示输入结束):\n");head = CreateList_End();//创建链表ShowLinklist(head);//输出链表}linklist *CreateList_End(){linklist *head, *p, *e;char ch;head = (linklist*)malloc(sizeof(linklist));e = head;//让e指向头节点ch = getchar();while(ch != '#'){p = (linklist*)malloc(sizeof(linklist));p->data = ch; e->next = p;//把新节点添加到表尾e = p;//把指针指向新节点ch = getchar();}e->next = NULL;//尾节点的指针域置空return head;}void ShowLinklist(linklist *h){linklist *p;p = h->next;while(p != NULL){printf("%c ", p->data);p = p->next;}printf("\n");}
添加了一个头节点后代码是不是就要清晰点了呢?
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习笔记(二) 链表之单链表的基本操作
- 【巩固基础】数据结构——链表的操作:链表的创建和逆序操作
- 数据结构 -- 单链表创建之头插法和尾插法
- 数据结构学习(五)——循环双链表的操作之创建,插入、删除
- 数据结构学习二 数据结构之链表代码版【创建,遍历,删除,插入】
- 数据结构学习二 数据结构之链表图解版【创建,遍历,删除,插入】
- 数据结构之——栈的创建于基本操作
- 数据结构之单链表操作二
- C语言之数据结构的顺序单链表创建,插入和删除操作
- 数据结构面试之二——双向链表表、循环链表、有序链表的常见操作
- 数据结构面试之二——双向链表表、循环链表、有序链表的常见操作
- 数据结构面试之二——双向链表表、循环链表、有序链表的常见操作
- 【学习总结】数据结构之循环链表的基本操作
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- 数据结构学习之栈和栈的操作源码
- 极光推送技术原理:移动无线网络长连接
- mysql 命令
- HDOJ2021 发工资咯:)
- 数据库大字段的处理方法
- DataFactory往Mysql插入数据失败解决方法
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- loadrunner监控Windows之前需要做的准备工作
- 程序员面试题精选100题(25)-在从1到n的正数中1出现的次数
- loadrunner监控Linux之前需要做的准备工作
- 需要学习的DSI
- loadrunner添加SQL Server监视出错解决
- powermanger API分析
- 基于TCP 的服务器、、客户端(socket)
- xp+vs 2003+oracle 9i 环境搭建