关于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) 循环顺序表实现队列 ...
随机推荐
- 使用UIWebView中html标签显示富文本
使用UIWebView中html标签显示富文本 用UIWebView来渲染文本并期望达到富文本的效果开销很大哦! Work 本人此处直接加载自定义字体"新蒂小丸子体",源码不公开, ...
- Go语言 map遍历
1 遍历顺序 Go语言里的map,是不保证遍历顺序的(这一点很好理解).甚至同样内容的map,两次遍历的顺序,也可能不一样.下面是一个例子: m := map[string]int{"a1& ...
- January 25 2017 Week 4 Wednesday
In every triumph, there's a lot of try. 每个胜利背后都有许多尝试. There's a lot of try behind every success, and ...
- API Gateway微服务
微服务中的 API 网关(API Gateway) 前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了 ...
- Webpack笔记(二)——搭建React开发环境
前几天一直在学习webpack,总算比之前学习的时候有了点收获,所以在昨天发布了一篇webpack入门笔记,今天继续使用webpack练了练手,搭建了一个React开发环境,如果还不熟悉的童鞋可以看一 ...
- JavaScript的DOM_节点的增删改
一.概述 DOM 不单单可以查找节点,也可以创建节点.复制节点.插入节点.删除节点和替换节点. 二.write()方法 write()方法可以把任意字符串插入到文档中去.会覆盖掉原来的html &l ...
- 阅读HandlerInterceptor接口源码的理解
一.阅读接口类注释 我先理解的方法,方法都看懂了类注释自然而然明白了.所以此处略. 二.阅读preHandle()方法注释 Intercept the execution of a handler. ...
- 九.mysql数据库多实例安装mysqld_multi [start,stop,report]
经常应为系统硬件短缺,导致需要在同一台硬件服务器上面安装多个mysql实例.之前的文章四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码 ...
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- 匹配iPhoneX
1.header中加一下标签 <meta name="viewport" content="width=device-width,initial-scale=1,m ...