本文将详细的介绍C语言单链表的创建、删除、查找、插入以及输出功能

一、创建

#include<stdio.h>
#include<stdlib.h> typedef int ElemType;
/*结构体部分*/
typedef struct Node
{
ElemType data; //数值域
struct Node *next; //指针域
}Linklist; Linklist *InitList(Linklist *L) //初始化单链表
{
L = (Linklist *) malloc(sizeof(Linklist));
L->next = NULL;
return L;
} Linklist *CreateList(int n)
{
/*通过输入n个数据,创建一个单链表*/
int x,i;
Linklist *L,*r,*p;
L = InitList(L); //构造头结点
r = L;
printf("input %d value: ",n);
for(i=;i<n;i++)
{
scanf("%d",&x);
p = (Linklist *)malloc(sizeof(Linklist));
p -> data = x;
p -> next = NULL;
r->next = p;
r = r->next; //指针r始终指向链表中末数据元素所在位置 }
return L;
}

二、插入

int InsItem1(Linklist *L,ElemType item,int x) /*给定的序号来插入*/
{
int i = ;
Linklist *p,*t;
p = L;
t = (Linklist *)malloc(sizeof(Linklist));
t ->data = item;
if(L->next==NULL)
{ /*若L为空表且要求将新结点插入到第0个位置*/
if(x==)
{
L->next=t;
t->next=NULL;
return ;
}
/*若L为空表且要求将新结点插入到第非0个位置 ,则操作失败*/
else
{
printf("wrong!\n");
return ;
}
}
while(p->next!=NULL&&i<x)
/*查找第i个节点*/
{
p = p->next;
i++;
}
if(p->next==NULL&&i<x)
/*在表中不存在插入位置i ,找不到,则插入操作失败*/
{
printf("The node %d is not exist\n",x);
return ;
}
else
{
t->next = p->next;
p->next = t;
return ;
}
} int InsItem2(Linklist *L,ElemType item,ElemType k) /*插入给定值在链表中的位置*/
{
Linklist *q,*p,*t;
t = (Linklist *)malloc(sizeof(Linklist));
t->data = item;
if(L->next==NULL)
{
printf("The linklist is empty\n");
return ;
}
else
{
q = L;
p = L->next;
while(p->next!=NULL)/*查找值为k的结点*/
{
if(p->data!=k)
{
q = p;
p = p->next;
}
else
break;
}
if(p==NULL)/*如p= =NULL,则没有值为k的结点,插入操作失败*/
{
printf("The node %d is not exist\n",k);
return ;
}
else
{
q->next = t;
t->next = p;
return ;
}
}
}

三、删除

int DelItem(Linklist *L,int x)
//在单链表中删除数据元素
{
int i = ;
Linklist *p,*q;
p = L;
if(L->next==NULL) /*L为空表,无结点可删除*/
{
printf("The linklist is empty!\n");
return ;
}
while(p->next!=NULL&&i<x)
{
p = p->next;
i++;
}
if(p->next==NULL)
/*若没有第i个结点,则删除操作失败*/
{
printf("The node %d is not exist\n",x);
return ;
}
else
{
q = p->next;
p->next = p->next->next;
free(q);
return ;
} }

四、查找

int LocItem(Linklist *L,ElemType x)
//查找给定值的结点位置
{
Linklist *p,*q,*r;
int i = ;
if(L->next==NULL)
{
printf("The linklist is empty\n");
return ;
}
else
{
p = L->next;
while(p!=NULL)
{
if(p->data!=x)
{
i++;
p = p->next;
}
else
break;
}
if(p==NULL)
/*如p= =NULL,则没有值为item的结点,删除操作失败*/
{
printf("The node %d is not exist\n",x);
return ;
}
/*若找到该节点返回该节点的位置*/
else
return i;
}
}

五、输出

void output(Linklist *L) //输出
{
Linklist *p;
p = L->next;
printf("output element: \n");
for(;p!=NULL;p=p->next)
{
printf(" %d ",p->data);
}
printf("\n");
}

六、主函数部分

int main()
{
ElemType x = ;
Linklist *L;
L = CreateList(x);
output(L);
InsItem1(L,,);
output(L);
InsItem1(L,,);
output(L);
DelItem(L,);
output(L);
printf("3的位置是: %d",LocItem(L,));
}

单链表创建、删除、查找、插入之C语言实现的更多相关文章

  1. 二叉排序树(BST)创建,删除,查找操作

    binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...

  2. PTA 循环单链表区间删除 (15 分)

    本题要求实现带头结点的循环单链表的创建和单链表的区间删除.L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于m ...

  3. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

  4. C-链表的一些基本操作【创建-删除-打印-插入】

    #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define LEN sizeof(stru ...

  5. 用OC实现一个栈:结合单链表创建动态栈

    一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...

  6. 不带头结点的单链表递归删除元素为X的结点

    #include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList ...

  7. 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

    一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...

  8. C语言——单链表初始化、求表长、读表元素、插入元素

    头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...

  9. 【链表问题】打卡2:删除单链表的第 K个节点

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...

随机推荐

  1. PAT 个位数统计

    描述 给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个 ...

  2. ArcEngine 10.2 汉化问题

    开发环境:VS2010 + ArcEngine 10.2 + DEV 15.2 arcengine自带工具条提示汉化方法: 1:重写tool里的方法 2:利用工具箱里的ToopTip 3:把:ArcG ...

  3. python基础学习笔记一

    1.变量 为了节省内存,python解释器会对一些简单的字符串以及小整型数,做出一些优化,当要定义的新变量的内容与定义过的内容相同时,会让两者使用同一个内存空间. 例如: 在这个例子里面,'old'是 ...

  4. 【Ansible】 基于SSH的远程管理工具

    [Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...

  5. Algorithm --> 二分图最大匹配

     匈牙利算法 二分图:把一个图的顶点划分为两个不相交集 U  和 V ,使得每一条边都分别连接U . V  中的顶点.如果存在这样的划分,则此图为一个二分图. 匹配:在图论中,一个「匹配」(match ...

  6. Algorithm --> 6174问题

    6174问题 假设一个各位数字不相同的四位数,把所有数字从大到小排序后得到a, 从小到大排序后得到b,然后用a-b替换原来这个数,继续操作.例如,从1234出发,依次有4321-1234=3078,8 ...

  7. 三十天学不会TCP,UDP/IP网络编程 -- TCP中的智慧之连续ARQ

    突然发现上一篇文章贴图有问题,关键我怎么调也调不好,为了表达歉意,我再贴一篇gitbook上的吧,虽然违背了我自己的隔一篇在这里发一次的潜规则~其余完整版可以去gitbook(https://www. ...

  8. Ubuntu安装Anaconda

    安装Anaconda的最简单方法是下载最新的Anaconda安装程序bash脚本,然后运行它. 在Anaconda Downloads页面找到最新版本的Anaconda for Python 3 .当 ...

  9. Oracle的用户,权限以及角色

    一.用户 1.创建用户 创建用户u密码为aa. SQL> create user u identified by aa; 2.为用户赋予权限 这个用户还不能连接数据库,必须为其赋予一些权限才可以 ...

  10. TensorFlow-谷歌深度学习库 用tfrecord写入读取

    TensorFlow自带一种数据格式叫做tfrecords. 你可以把你的输入转成专属与TensorFlow的tfrecords格式并保存在本地. -关于输入碎碎念:输入比如图片,可以有各种格式呀首先 ...