单链表c语言实现的形式
包括初始化,创建,查询,长度,删除,清空,销毁等操作
代码如下:
#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book
{
char name[10];
char code[10];
float price;
}book;
typedef book Book;
//定义单链表
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
//初始化
void InitLNode(struct LNode*L)
{
L=(LNode*)malloc(sizeof(LNode));
if (!L)
{
printf("分配空间出错,初始化失败!");
exit(1);
}
L->next=NULL;
}
//头插法,创建单链表
LNode* creatList(void)
{
LNode *head;
LNode *s;
LNode *p;
Book c;
head=(LNode*)malloc(sizeof(LNode));
p=head;
p->next=NULL;
printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
scanf("%s%s%f",&c.name,&c.code,&c.price);
while (c.price>0)
{
s=(LNode*)malloc(sizeof(LNode));
s->next=p->next;
p->next=s;
s->data=c;
printf("请输入书名,编码和价格:\n");
scanf("%s%s%f",&c.name,&c.code,&c.price);
}
printf("creatList函数执行,创建链表成功\n");
return head;
}
//单链表的长度
int length(struct LNode *L)
{
int i=0;
LNode *p;
p=L;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return i;
}
//单链表的插入
LNode* insertheadList(struct LNode* L,int i,Book b)
{
LNode *s,*p;
p=L;
int j=0;
if (i<=0)
{
printf("插入越界!\n");
exit(1);
}
while (p->next!=NULL)
{
if (j==i-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=b;
s->next=p->next;
p->next=s;
printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
break;
}
p=p->next;
j++;
}
return L;
}
//单链表查询
Book search(struct LNode*L,int i)
{
int j;
Book b;
LNode *p;
p=L;
if (i<0)
{
printf("查询的节点越界了!");
exit(1);
}
j=1;
while (p->next!=NULL)
{
p=p->next;
if (j==i)
{
b=p->data;
break;
}
j++;
}
return b;
}
//单链表的删除
Book DelList(struct LNode*L,int i)
{
Book b;
LNode *s,*p;
p=L;
int j;
if (i<1)
{
printf("删除越界!\n");
exit(1);
}
j=0;
while (p->next!=NULL)
{
if (j==i-1)
{
s=p->next;
b=s->data;
p->next=s->next;
// printf("删除第%d个节点成功,删除的值为:name:%s,code:%s,price:%d\n",b.name,b.code,b.price);
free(s);
}
p=p->next;
j++;
}
return b;
}
//清空单链表
void ClearList(struct LNode*L)
{
LNode *p,*r;
p=L;
while (p)
{
p=p->next;
r=p;
free(p);
p=r;
}
L->next=NULL;
}
//销毁单链表
void DestroyList(struct LNode*L)
{
LNode *p,*head;
head=L;
while (head)
{
p=head->next;
free(head);
head=p;
}
}
void main()
{
LNode L,*Q;
Book b;
int i;
Q=&L;
InitLNode(&L);
L=*creatList();
printf("请输入书本的name,code和price:\n");
scanf("%s%s%f",&b.name,&b.code,&b.price);
insertheadList(&L,1,b);
int y=length(&L);
printf("单链表的length:%d\n",y);
//删除第一个元素
Book bo= DelList(Q,1);
printf("删除了第1个元素,它的name:%s,code:%s,price:%f\n",bo.name,bo.code,bo.price);
ClearList(Q);
printf("清空单链表成功!\n");
//按链表的存储顺序输出
i=1;
while (Q->next!=NULL)
{
Book book=search(&L,i);
Q=Q->next;
printf("name:%s,code:%s,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
i++;
}
}
单链表c语言实现的形式的更多相关文章
- 单链表 C语言 学习记录
概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...
- 带头结点的循环单链表----------C语言
/***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...
- 带头节点的单链表-------C语言实现
/***************************************************** Author:Simon_Kly Version:0.1 Date:20170520 De ...
- 不带头结点的单链表------C语言实现
File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
- 数据结构—单链表(类C语言描写叙述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
随机推荐
- 使用 js 实现一个简易版的 async 库
使用 js 实现一个简易版的 async 库 具有挑战性的前端面试题 series & parallel 串行,并行 refs https://www.infoq.cn/article/0NU ...
- Service Worker in Action
Service Worker in Action https://caniuse.com/#feat=serviceworkers Service Workers 1 W3C Candidate Re ...
- html 布局,上下各100px,中间自适应
flex <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- springCloud服务流程
springCloud的服务流程:消费者调用生产者 1.通过接口化的请求调用(指定接口的服务名字和服务地址)只是做定义,并没有真正做到. 2.Feign组件,远程去注册中心找到服务的名字和服务的地址然 ...
- linux文件权限的查看和修改(转)
原文链接:https://www.cnblogs.com/sxdcgaq8080/p/7498906.html 命令: chmod 777 scan_record.js 格式: chmod 权限数字 ...
- 微信小程序:事件绑定
小程序中绑定事件,通过bind关键字来实现.如bindinput,bindtap(绑定点击事件),bindchange等. 什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑 ...
- Go的函数
目录 Go的函数 一.函数的定义 1.函数的基本格式 2.函数的参数 2.1 函数传参的特点:copy传值 3.函数的返回值 4.可变长参数 二.函数的类型 1.给函数的类型重命名 三.匿名函数 1. ...
- 关于Java高并发编程你需要知道的“升段攻略”
关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...
- Java练习——抽象类
需求: 2辆宝马,1辆别克商务舱,1辆金龙(34)座,租5天共多少租金. 轿车 客车(金杯.金龙) 车型 别克商务舱GL8 宝马550i 别克林荫大道 <=16座 >16座 日租费(元 ...
- LeetCode-二叉树的镜像
二叉树的镜像 二叉树的镜像 给定一个二叉树,输出二叉树的镜像. 只需要使用一个简单的递归,分别对左右子树反转后再对当前结点进行反转. #include<iostream> #include ...