关于C链表的实现
学习了数据结构后,自己学习写了一个链表的程序。
初步功能是实现了。但是不知道会不会有一些隐含的问题。所以希望大佬指导指导
/******************/
/*一个小的链表程序*/
/******************/
#include <stdio.h>
#include <stdlib.h>
//结点的结构体
typedef struct node
{
char data;
struct node*next;
}Node;
//链表的结构体
typedef struct
{
Node *head;
Node *list1;
int num;
}NList;
//生成一个链表
void CreateList(NList *list)
{
list->head = NULL;
list->list1 = NULL;
list->num = ;
}
//向链表中添加数据
void AddList(NList *list)
{
char data;
scanf("%c",&data);
while(data != '#')
{
if(list->head == NULL)
{
list->head = (Node *)malloc(sizeof(Node));
list->head->data = data;
list->head->next = NULL;
list->list1 = list->head;
list->num = ;
}
else
{
Node *p = (Node *)malloc(sizeof(Node));
list->list1->next = p;
p->data = data;
list->list1 = p;
list->list1->next = NULL;
list->num++;
}
scanf("%c",&data);
}
}
//显示链表中的数据
void ShowList(NList list)
{
Node *P1;
P1=list.head;
while(P1 != NULL)
{
printf("%c",P1->data);
P1 = P1->next;
}
}
//删除链表头的数据
void DelList_head(NList *list)
{
if(list->head != NULL)
{
Node *p2 = list->head;
list->head = p2->next;
list->num--;
free(p2);
}
else
{
printf("链表中不存在数据\n");
}
}
int main()
{
NList list2;
CreateList(&list2);
AddList(&list2);
ShowList(list2);
printf("\n链表中的数据个数是:%d个\n",list2.num);
DelList_head(&list2);
ShowList(list2);
printf("\n链表中的数据个数是:%d个\n",list2.num);
return ;
}
程序的执行结果如下:

另一个更加优化的链表代码,注释思路更加清晰:
#include <stdio.h>
#include <stdlib.h>
//结点的结构
typedef struct Node
{
int data;
struct Node *link;
}node;
//创建一个头结点
node * create_list(int x)
{
node *p = (node *)malloc(sizeof(node));
p->data = x;
p->link = NULL;
return p;
}
//向链表中添加数据
void add_list(node * head,int x)
{
if(!head)return;
while(head->link)
head = head->link;
node *p = (node *)malloc(sizeof(node));
p->data = x;
p->link = NULL;
head->link = p;
}
//在链表中查找数据
node * find_list(node * head,int x)
{
while(head && head->data != x)
head = head->link;
if(head) return head;
return NULL;
}
//打印链表中的数据
void show_list(node * head)
{
while(head)
{
printf("%d->",head->data);
head = head->link;
}
printf("null\n");
}
//反转链表
node * reverse(node * head)
{
node * new = NULL,*old = head,*temp;
while(old)
{
temp = old->link;
old->link = new;
new = old;old = temp;
}
return new;
}
//删除链表头节点
node * del_list(node * head)
{
if(!(head))return NULL;
node *p = (head);
(head) = (head)->link;
free(p);
return head;
}
//删除链表,需要修改head的指向,所以使用二级指针
void del_list_all(node **head)
{
while((*head))
(*head) = del_list((*head));
}
//测试程序
int main()
{
node *ptr = create_list(1);
add_list(ptr,2);
add_list(ptr,3);
add_list(ptr,4);
show_list(ptr);
if(find_list(ptr,5)) printf("查找到3的节点\n");
else printf("未找到3的节点\n");
if((ptr = del_list(ptr)) == NULL) printf("该链表为空链表,不可删除\n");
show_list(ptr);
del_list_all(&ptr);
show_list(ptr);
return 0;
}
关于C链表的实现的更多相关文章
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
- laravel where筛选会判断类型吗?
laravel where筛选会判断类型吗? laravel where筛选会判断类型吗? laravel where筛选会判断类型吗? 这个说会判断不对,说不会判断也不对. 当字符串'1'和数值1是 ...
- July 14th 2017 Week 28th Friday
A life without a dress rehearsal, every day is broadcast live. 人生没有彩排,每天都是现场直播. Every day when I pre ...
- 用python自建一个DNS服务器
前段日子一直在做公司的DNS调度程序,不过由于性能比较差,方案最终废弃掉了.两个半月心血,不想白白浪费掉,于是改了改,把商业秘密相关的部分去掉,变成了一个公共的DNS服务器.其实说的简单点,就是一个可 ...
- iOS开发之GCD总结
直接贴出常用的函数,方便要用的时候直接使用. ------------- type 1 ---------------- 说明 : 创建一个dispatch_group_t,每次网络请求前先 ...
- building for production...Killed
npm run build报错 building for production...Killed 原理 按照他人的说法是,服务器内存不够用了,这样就给他配置一个单独的内存出来就解决了 解决方法 sud ...
- Spring MVC 框架
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...
- php分页方法
$page_on=15;//定义每页显示数 $pageNum=$_GET['pageNum']; //当前页数 $result = mysql_query("SELECT * FROM ne ...
- javaSpring知识点总结
1 js 概述 js是一门基于对象和事件驱动的脚本语言,主要应用在客户端 js特点: 交互性(信息的动态交互) 安全性(不允许直接访问本地硬盘) 跨平台(只要是可以解释js的浏览器都可以执行,和平台无 ...
- Shell脚本之Crontab的格式
Crontab的格式 第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 ...
- sql中UNION和UNION ALL的区别
写sql时我们经常会遇到需要把从多张表查询的集果集进行合并.这时就用到了union.使用union或union all 时一定要保证查询的列的一致性 .不然sql会报错.字段不一致的话可以用单引号来占 ...