本文将详细的介绍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. Ubuntu 14.04下Hadoop2.4.1集群安装配置教程

    一.环境 系统: Ubuntu 14.04 64bit Hadoop版本: hadoop 2.4.1 (stable) JDK版本: OpenJDK 7 台作为Master,另3台作为Slave. 所 ...

  2. Redis查询,设置超时时间

    1.定义 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  3. jmeter 前置处理器提取用户cookie信息 比如jsessionid

    一般登录过程分成两步,一步是打开登录页面, 一步是输入用户名和密码登录 现在B/S架构的系统好多时候都只在客户端的cookie信息保留一个jsessionId,然后每次请求的时候在请求的头信息的coo ...

  4. 如何解决js递归里面出现的堆栈溢出

    16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出.在保留递归模式的基础上,你怎么解决这个问题? var list = readHugeList(); var nextListItem = fu ...

  5. Intellij Idea下tomcat设置自动编译

    *eclipse默认tomcat下是自动完成编译:而Intellij Idea默认tomcat下不是自动完成编译,从如下开始设置: 进入"settings",如下图找到" ...

  6. 20165226 2017-2018-3 《Java程序设计》第5学习总结

    20165226 2017-2018-3 <Java程序设计>第5周学习总结 教材学习内容总结 第七章 内部类与异常类 匿名类创建对象: new Bank() { 匿名类的类体 }: 异常 ...

  7. unittest自动化使用HTMLTestRunner的中文编码问题

    1.使用unittest自动化测试框架,使用HTMLTestRunner生成测试报告,中文乱码问题! 如图 2.解决方法: 第一步:先在自己的测试脚本中添加 import sys reload(sys ...

  8. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  9. iOS极光推送SDK的使用流程

    一.极光推送简介 极光推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,整合了iOS.Android和WP平台的统一推送服务.使用起来方便简单,已于集成,解决了原生远程推送繁 ...

  10. CISCO路由器练习

    前言: 总结了昨天的学习和今天的单臂路由 写了今天的文章. 目录: 路由器的基本配置 单臂路由的练习 正文: 路由器基本配置 环境要求 cisco模拟器 2台交换机 2台PC 1台路由器 路由器介绍: ...