/* 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. HTML连载26-谷歌开发者工具其它作用&CSS继承性

    一.谷歌开发者工具其他特性(谷歌浏览器快捷键F12) (1)元素选择, 在里面我们可以看到某些行的具体代码 (2)查看源代码 (3)该元素的样式显示,我们可以看到我们选中的元素的具体样式属性,可以在里 ...

  2. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...

  3. pyspark 日常整理

    1  联表 df1.join(df2,连接条件,连接方式) 如:df1.join(df2,[df1.a==df2.a], "inner").show() 连接方式:字符串类型, 如 ...

  4. wifi串口服务器

    下面与大家分享上海卓岚无线wifi串口服务器ZLAN7104创建虚拟串口的设置使用心得 一.7104网线连接计算机,用ZLVircom即可搜索并配置 其中,串口设置需要匹配实际所接的串口设备,配置为相 ...

  5. 使用numpy处理数组

    def fun_ndarray(): a = [[1,2,7], [-6,-2,-3], [-4,-8,-55] ] b = np.array(a) b = np.abs(b)#取数组的绝对值 pri ...

  6. 洛谷疯狂coding~

    1.关于数学建模思想在coding之中的应用. 将马路作为一条数轴,每棵树的位置作为数轴上的坐标点,再将坐标点与数组的下标联系到一起,完成建模. 2.本题坑点在于对“其中有多少个数,恰好等于集合中另外 ...

  7. SpringBoot整合mybatis及注意事项

    SpringBoot整合mybatis及注意事项 主要步骤 添加依赖 mybatis 在配置文件中配置数据源信息 编写pojo mapper接口 mapeer映射文件 手动配置mybatis的包扫描 ...

  8. office常用技巧汇总

    1.excel篇 (1)一次选择多行 可以利用SHIFT+鼠标实现,点第一行,按下鼠标,点200行,就能实现1~200行选择了. 总结:就是一直按住shift键,鼠标点击要选择的首行,再点击尾行.

  9. html 四种定位含义

    技术过段时间不用的话就会忘记,需要复习一下 1.static:默认值.没有定位,元素出现在正常的流中(忽略top,bottom,left,right或者z-index声明). 2.relative:生 ...

  10. VSCode打字特效Power Mode插件

    由于最近比较频繁使用VSCode这个软件写代码,然后里面有一个非常炫酷的打字特效插件,平时写代码的时候不会感觉太枯燥(其实就是装一下逼吧)! 安装很简单,但是容易忘,所以这里整理一下具体的部署步骤. ...