关于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) 循环顺序表实现队列 ...
随机推荐
- QT网络编程Tcp下C/S架构的即时通信
先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #in ...
- Redis添加访问密码
进入Redis的安装目录,找到redis.conf文件. 1.修改密码:使用vi命令打开redis.conf文件,先使用字符匹配查找到requirepass foobared对应的位置, 然后修改fo ...
- 手工执行sql tuning advisor和sql access advisor
sql tuning advisor:创建任务DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext := 'SELE ...
- MySQL绿色解压缩版安装与配置
操作步骤: 一.安装MySQL数据库 1.下载MySQL-5.6.17-winx64.zip文件.2.解压到指定目录,本例为D:\mysql-5.6.17-winx64.3.修改配置文件,my-def ...
- backtrack渗透测试中常用的命令总结
ping 域名/ip 测试本机到远端主机是否联通. dig 域名/ip 查看域名解析的详细信息. host -l 域名 dns服务器 传输zone. 扫描 nmap: -sS 半开扫描TCP和SYN扫 ...
- js实现抛物线运动 兼容IE低版本(转)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Codeforces Round #436 (Div. 2)【A、B、C、D、E】
Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...
- Java中类继承、接口实现的一些要注意的细节问题
1.接口A和接口B有相同的方法,只是返回值不同,则实现类不能同时实现这两个接口中的方法. 接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口. Java为了弥补类单继承 ...
- 从windows到linux的换行转换工具dos2unix
同学们也许知道,windows中的文本文件的换行符是"\r\n",而linux中是"\n".由于换行符的不同,所以有的时候会发生一些莫名其妙的状况.至于具体什么 ...
- centos7 yum安装mysql后启动不起来问题
[root@localhost ~]# systemctl start mysqld 启动失败 Job for mysqld.service failed because the cont ...