/* 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. Unity Shader 2D水流效果

    水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: Shader & ...

  2. python正确使用异常处理机制

    一.不要过度使用异常 不可否认,Python 的异常机制确实方便,但滥用异常机制也会带来一些负面影响.过度使用异常主要表现在两个方面: 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是以简单 ...

  3. windows通过秘钥使用ssh和scp

    windows10内置支持了ssh和scp等仿linux指令,可以让我们方便的使用类似linux的工作流把日常的代码资源部署维护工作写成脚本(批处理). ssh和scp都有-i参数可以通过指定一个私钥 ...

  4. MySQL、HBase、ES的对比

    hbase是列数据库,是kv结构的,ES的基于Lucene的搜索引擎的面向文档数据库吧 ES是搜索引擎,主要的优势在于快速搜索,HBase是数据库,优势在于存储数据,侧重点不同 MySQL:关系型数据 ...

  5. vue同一个路由,但参数发生变化,页面不刷新的问题(vue监听路由参数变化重新渲染页面)

    watch: { $route: function(newVal, oldVal) { console.log(oldVal); //oldVa 上一次url console.log(newVal); ...

  6. python 双层for循环,在第二层的for循环中的else中的continue,会退出到第一层for循环继续执行

    for a in [1,2,3,4,5]: for b in [1,2,3]: if a == b: print("a = b = %s" % a) break # 退出本次for ...

  7. PAT 1026程序运行时间

    PAT 1026程序运行时间 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间 ...

  8. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 package com.ws.commons.cache; import java.util.function.Func ...

  9. HTML 统一资源定位器

    URL 也被称为网址. URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上冲浪时,会键入网址的域名,因为名称比数 ...

  10. 将MySQL升级到8.0.x后的遇到到错误及解决

    一,安装的时遇到的坑 我下的是Mysql 8.0.13 地址:https://dev.mysql.com/downloads/mysql/ 下的是解压版(个人能不用安装就不想用安装版的强迫症(/▽\) ...