数据结构的 单链表的操作(头插法)和(尾插法)
来源:互联网 发布:pdg2pdf mac 编辑:程序博客网 时间:2024/06/08 02:20
链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的。在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");
- }
0 0
- 数据结构的 单链表的操作(头插法)和(尾插法)
- 数据结构学习一(单链表的操作)
- 数据结构 - 串的性质和基本操作(一)
- 数据结构 - 串的性质和基本操作(二)
- 数据结构-单链表的操作
- 数据结构->单链表的操作
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
- 数据结构(第二天)单链表的基本操作,创建单链表,头插法,尾插法,删除节点,查询节点
- 【数据结构】单链表(一)单链表的定义,插入,删除和查找操作
- 数据结构(顺序表的两个操作)
- 顺序表的简单操作(数据结构)
- 栈的简单基本操作(数据结构)
- 树的相关操作(数据结构)
- 图的相关操作(数据结构)
- 数据结构 顺序表的操作(源代码)
- 数据结构(27)二叉树的操作
- 杭电OJ 1005:Number Sequence
- JavaScript权威指南:数组(第七章)
- ZOJ-1899
- maven ZZ学习笔记,讲解的很好
- 日期结构体
- 数据结构的 单链表的操作(头插法)和(尾插法)
- libevent2入门例-简单的服务器(也有简短客户端)
- CSU 1312
- 谈谈C# 4.0新特性“缺省参数”的实现
- Add Binary
- html5+jquery+mysql登陆验证
- 十道面试题
- Linux内存管理 mmap系统调用
- Neutron 架构学习