C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1、数据结构-单链表的实现-C语言
typedef struct LNode
{
int data;
struct LNode* next;
} LNode,*LinkList; //这两者等价。LinkList这样方便理解
void Show_Help();
//初始化线性表
void InitList(LinkList *L);
//销毁线性表
void DestroyList(LinkList *L);
//清空线性表
void ClearList(LinkList *L);
//线性表是否为空
int ListEmpty(LinkList *L);
//线性表长度
int ListLength(LinkList *L);
//线性表查找
void GetElem(LinkList L,int i);
//返回相同元素的位置
void LocateElem(LinkList L,int e);
//求前驱
void PriorElem(LinkList L,int previous);
//求后继
void NextElem(LinkList L,int next);
//插入元素
void ListInsert(LinkList *L,int key,int value);
//删除元素
void ListDelete(LinkList *L,int key);
//显示线性表中元素
void TraverList(LinkList L);
//线性表翻转
//--------------------------------------------------------------------
void Show_Help()
{
printf("1---初始化单链表\n");
printf("2---销毁单链表\n");
printf("3---置空单链表\n");
printf("4---判断单链表是否为空\n");
printf("5---求单链表长度\n");
printf("6---获取单链表某位置元素\n");
printf("7---请输入元素的值,判断其在单链表中是否存在,并返回其下标,不存在则返回0\n");
printf("8---求直接前驱\n");
printf("9---求直接后继\n");
printf("10---插入元素\n");
printf("11---删除元素\n");
printf("12---显示单链表全部元素\n");
printf("13---翻转单链表全部元素\n");
printf("14---演示单链表的并操作\n");
printf("退出,输入一个负数\n");
}
void InitList(LinkList *L)
{
*L = (LNode*) malloc(sizeof(LNode)); //生成头结点,并用L指针指向头结点
if(!(*L)){
printf("分配失败\n");
return ;
}
(*L)->next = NULL;
}
void DestroyList(LinkList *L)
{
//销毁时要从头到尾都删除
LinkList cut;
while(*L){
cut = *L;
*L = (*L)->next;
free(cut);
}
}
void ClearList(LinkList *L)
{
//把除了头结点的其他全删除
LinkList cut=(*L)->next;
LinkList middle;
while(cut){
middle = cut->next;
free(cut);
cut = middle;
}
}
int ListEmpty(LinkList *L)
{
if((*L)->next == NULL)
return 1;
else
return 0;
}
int ListLength(LinkList *L)
{
int num = 0;
LNode* middle = (*L);
while(middle->next){
num++;
middle = middle->next;
}
return num;
}
void GetElem(LinkList L,int i)
{
LinkList middle = L->next;
int key = 1;
int value;
while(middle && key<i){
middle = middle->next;
key++;
}
if(key>i || middle==NULL){
printf("输入范围有误,请重新选择。\n");
return;
}
value = middle->data;
printf("位于第%d个位置的值为:%d\n",i,value);
}
void LocateElem(LinkList L,int value)
{
LinkList middle = L->next;
int key = 0;
int num = 1;
while(middle){
middle = middle->next;
num++;
if(middle->data == value){
key = num;
break;
}
}
if(key)
printf("%d在单链表中下标为%d\n",value,key);
else
printf("%d在单链表中不存在\n",value);
}
void PriorElem(LinkList L,int previous)
{
if(previous == 1){
printf("第一个元素没有前驱,请重新选择。\n");
return;
}
LinkList middle = L->next;
int num = 1;
int value;
while(num<(previous-1) && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>(previous-1)){
printf("输入范围有误,请重新选择。\n");
return;
}
value = middle->data;
printf("第%d个位置的前驱为:%d\n",previous,value);
}
void NextElem(LinkList L,int next)
{
LinkList middle = L->next;
int num = 1;
int value;
while(num<(next+1) && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>(next+1)){
printf("输入范围有误,请重新选择。\n");
return;
}
if(num == next){
printf("最后一个元素没有后继,请重新选择。\n");
return;
}
value = middle->data;
printf("第%d个位置的后继为:%d\n",next,value);
}
void ListInsert(LinkList *L,int key,int value)
{
LinkList middle = (*L);
int num = 0;
while(num<key-1 && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>key-1){
printf("输入范围有误,请重新选择。\n");
return;
}
LinkList insert;
insert = (LNode*) malloc(sizeof(LNode)); //给要插入的结点分配空间
insert->next = middle->next;
insert->data = value;
middle->next = insert;
}
void ListDelete(LinkList *L,int key)
{
LinkList cut = (*L)->next;
int num = 1;
while(num<key && cut){
num++;
cut = cut->next;
}
if(!cut || num>=key){
printf("输入范围有误,请重新选择。\n");
return;
}
LinkList middle = cut->next;
cut->next = middle->next;
free(middle);
}
void TraverList(LinkList L)
{
printf("单链表所有元素有:");
int num = 1;
LinkList value = L->next;
while(value){
printf("%d ",value->data);
value = value->next;
}
printf("\n");
}
void Filp(LinkList* L)
{
LinkList q = (*L)->next;
LinkList p = q->next;
while(p){
q->next = p->next;
p->next = (*L)->next;
(*L)->next = p;
p = q->next;
}
printf("翻转成功\n");
}
C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作的更多相关文章
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- 数据结构 单链表&顺序表
顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...
- python实现数据结构单链表
#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- GO语言数据结构之链表
链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分: ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- 数据结构——单链表java简易实现
巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成 通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...
随机推荐
- 用nfs挂载内核时出错 ERROR: Cannot umount的解决办法
SMDK2440 # nfs 30000000 192.168.1.106:/work/nfs_root/uImage ERROR: resetting ...
- 下拉框改变事件:获取下拉框中当前选择的文本 SelectionChanged事件
/// <summary> /// 下拉框改变事件:获取下拉框中当前选择的文本 /// </summary> /// <param name="sender&q ...
- SqlServer——判断对象是否存在
对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...
- 关于static的继承问题
今天研究了一下被static修饰的变量和方法,在子类中继承的问题,网上也看了别人的博客,自己也动手试了一下 代码如下 //父类 package com.xujingyang.test; public ...
- vue-resource基础介绍
1.vue-resource 的请求api是按照rest风格设计的,它提供了7种请求api get(url, [data], [options]); head(url,[data],[options] ...
- WarTransportation TopCoder - 8404
传送门 分析 我们高兴的发现数据范围特别小,所以我们可以随便搞.因为一共只砍掉一条路,所以我们先算出对于任意一个点如果将它的出边割掉一条则它到达终点的最坏情况的最短距离是多少,然后我们从终点向起点反着 ...
- Java Calendar 类的时间操作.RP
JavaCalendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/a ...
- Notepad++一键编译运行(Python、Java、C++)
Python 需要事先安装Python配置好环境变量.建议使用Anaconda,方便. 在Notepad按F5,输入如下 cmd /k chdir /d $(CURRENT_DIRECTORY) &a ...
- python部分运算符理解
1.//取整除 5//3得到1 2.%取余 5%3得到2 3.<<左移 2<<2得到8 2用二进制表示为10,向左移两位得到1000,即十进制的8 4.>>右移 1 ...
- Linux操作系统下IPTables配置方法详解
如果你的IPTABLES基础知识还不了解,建议先去看看. 们来配置一个filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Cha ...