/* singlyLinkedList.c */
/* 单链表 */
/* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 */ #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> /* 节点结构 */
/* head
————————————————
| value | next | -> ...
————————————————
*/
typedef struct node {
int value; /* 节点的值 */
struct node *next; /* 指向下一个节 */
} Node; /* 链表函数声明 */
void interface(void);
void addNode(Node **head, int number);
int findNode(Node *head, int number);
bool deleteNode(Node **head, int number);
void traverseNodes(Node *head);
int lengthNodes(Node *head);
bool clearNodes(Node **head); /* 程序主函数入口 */
int main(int argc, char *args[]){
/* head为指向链表头部节点的指针 */
Node *head = NULL;
int flag, number; interface();
for(;;){
printf("Command: ");
scanf("%d", &flag);
switch(flag){
case :
printf("Bye!\n");
return ;
case :
printf("Enter numbers(0 to stop): ");
for(;;){
scanf("%d", &number);
if(number==)
break;
addNode(&head, number);
}
break;
case :
printf("Enter the node value: ");
scanf("%d", &number);
printf("index: %d\n", findNode(head, number));
break;
case :
printf("Enter the node value: ");
scanf("%d", &number);
if(deleteNode(&head, number))
printf("Successfully deleted node %d\n", number);
else
printf("Failed to locate node %d\n", number);
break;
case :
traverseNodes(head);
break;
case :
if(clearNodes(&head))
printf("Done!\n");
break;
case :
printf("length: %d\n", lengthNodes(head));
break;
}
} return ;
} /* 用户界面 */
void interface(void){
puts("+*************************************************+");
puts("+ 0, quit 退出 +");
puts("+ 1, add nodes 添加 +");
puts("+ 2, find node 查找 +");
puts("+ 3, delete node 删除 +");
puts("+ 4, traverse nodes 遍历 +");
puts("+ 5, clear nodes 清除 +");
puts("+ 6, length 长度 +");
puts("+*************************************************+");
} /* 链表函数 */
/* 添加节点 */
/* 注意:函数需要修改到head,需要将head的地址传入 */
void addNode(Node **head, int number){
/* 使用malloc动态分配一个新节点 */
Node *node = (Node*)malloc(sizeof(Node));
node->value = number;
node->next = NULL; Node *last = *head;
if(!last){
/* 如果head为空,说明链表为空,将head指向node节点 */
*head = node;
}else{
/* 找到链表尾部,将last节点结构的next属性执行node节点 */
while(last->next){
last = last->next;
}
last->next = node;
}
}
/* 根据值查找节点 */
int findNode(Node *head, int number){
int index = ;
for(Node *p=head; p; p=p->next, index++){
if(p->value==number)
return index;
}
return -;
}
/* 根据值删除节点 */
bool deleteNode(Node **head, int number){
/* 如果要删除第一个节点,需要改变head指向第二个节点并free第一个节点 */
if(number==){
Node *first = *head;
Node *second = first->next;
free(first);
*head = second;
return true;
}else{
/* p指向当前节点,f指向p之前的节点 */
Node *f = NULL;
for(Node *p=*head; p; p=p->next){
if(p->value==number){
f->next = p->next;
free(p);
return true;
}
f = p;
}
}
return false;
}
/* 遍历链表 */
void traverseNodes(Node *head){
/* 遍历链表,从头到尾,遇到节点的next为NUll,则表明到了链表尾部 */
for(Node *p=head; p; p=p->next){
printf("%d -> ", p->value);
}
printf("0\n");
}
/* 清空链表 */
bool clearNodes(Node **head){
/* 遍历链表,清空节点 */
Node *q = NULL;
for(Node *p=*head; p; p=q){
q = p->next;
free(p);
}
*head = NULL;
return true;
}
/* 链表长度 */
int lengthNodes(Node *head){
int count = ;
for(Node *p = head; p; p=p->next)
count++;
return count;
}

数据结构——单链表(singly linked list)的更多相关文章

  1. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  2. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  3. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  4. java数据结构——单链表、双端链表、双向链表(Linked List)

    1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...

  5. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

  6. 数据结构之链表(Linked list)

    1, 无序链表(Unordered linked list) 链表是有若干个数据节点依次链接成的数据结构,如下图所示,每一个数据节点包括包括数据和一个指向下一节点的指针.(python中的list就是 ...

  7. Java数据结构之链表(Linked List)

    1.链表(Linked List)介绍 链表是有序的列表,但是它在内存存储结构如下: 2.特点: 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 链 ...

  8. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

  9. 数据结构-------单链表(C++)

    相关信息: /** * @subject 数据结构 实验2 * @author 信管1142班 201411671210 赖俊杰 * @project 单链表 * @time 2015年10月29日1 ...

随机推荐

  1. 用java编写爬虫爬取电影

    一.爬取前提1)本地安装了mysql数据库2)安装了idea或者eclipse等开发工具 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑1)进入电影网列表页, 针对列表的htm ...

  2. Eureka与Zookeeper的区别

    ACID与ACP的介绍

  3. GitHUB帐号申请及相关操作

    GitHUB帐号申请及相关操作 GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.GitHub 于 2008 年 4 月 10 ...

  4. Mac PyCharm激活/激活码

    此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.com/pycharm/download/ 激活前准备工作 ...

  5. [转帖]SQL Server DBCC命令大全

    SQL Server DBCC命令大全   原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPC ...

  6. 在 ubuntu 下如何压缩与解压 7zip 文件。

    1.  首先利用 ubuntu 软件中心搜索并下载 7zip.或者在终端中输入:sudo apt-get install p7zip 2. 压缩 3. 解压 谢谢浏览!

  7. 那些前端二进制操作API

    一直以来,前端的工作主要涉及的是字符串操作,而对二进制的数据接触较少.但是这种需求却一直存在着,尤其是HTML5之后,随着web应用越来越复杂,File,Blob,TypedArray这些API的出现 ...

  8. 参加AWS技术峰会的收获与思考

    7月31日,我参加了AWS 技术峰会2019北京站的会议. 从厦门到帝都,奔赴千里,只为一场技术盛宴,我想记录一些收获和思考,才能不负此行. 大会议程全天,上午是主题演讲和行业解决方案展示,下午是技术 ...

  9. 【BZOJ4833】最小公倍佩尔数(min-max容斥)

    [BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...

  10. 快捷键-Visual Studio Code快捷键

    Shift+Enter 在Python终端中运行选定内容/行 C