最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看。

  里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更好的理解,再来添加

 #define TRUE                    1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define Status int
#define ElemType int typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode; typedef LNode LinkList;
Status ListInsert_L(LinkList L, int i, ElemType e);//插入函数
Status ListDelete_L(LinkList L, int i, ElemType *e);//删除某个元素
void CreateList_L(LinkList L, int n);//创建一个带头结点的空链表
void MergeList_L(LinkList *La, LinkList *Lb, LinkList **Lc); //合并两个有序链表

LinkList.h

 #include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "LinkList.h" //新建带头结点的空链表
void CreateList_L(LinkList **L, int n)
{
int i; LinkList *p = NULL;
(*L) = (LinkList*) malloc (sizeof (LNode));
(*L) ->next = NULL;
printf("请输入链表元素 :\n");
for(i = n; i > ; --i)
{
p = (LinkList*) malloc (sizeof (LNode));//生成新结点
scanf("%d", &p -> data);//输入元素值
p -> next = (*L) -> next;
(*L) -> next = p;//插入到表头
}
} //插入元素
Status ListInsert_L(LinkList *L, int i, ElemType e)
{
LinkList *p = L;
LinkList *s = NULL;
int j = ;
while (p->next && j < i - )
{
p = p -> next;
++ j;
}
if(!p || j != i - )
return ERROR;
s = (LinkList*) malloc (sizeof(LNode));
s -> data = e;
s -> next = p ->next;
p -> next = s;
return OK;
} //删除元素
Status ListDelete_L(LinkList *L, int i, ElemType *e)
{
LinkList *p = L;
LinkList *q;
int j = ;
while(p -> next && j < i - )
{
p = p -> next;
++ j;
}
if(!(p -> next) || j > i - )
return ERROR;
q = p -> next;
p -> next = q -> next;
*e= q -> data;
free(q);
return OK;
} void MergeList_L(LinkList *La, LinkList *Lb, LinkList **Lc)
{
LinkList *pa = La -> next;
LinkList *pb = Lb -> next;
LinkList *pc = NULL;
(*Lc) = pc = La;
while(pa && pb)
{
if(pa -> data <= pb -> data)
{
pc -> next = pa;
pc = pa;
pa = pa ->next;
}
else
{
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
pc -> next = pa ? pa : pb;//插入剩余段
free(Lb);//释放Lb头结点
Lb = NULL; } void Free(LinkList *L)
{
if(L && L -> next)
Free( L -> next);
free(L);
return;
} int main()
{
int selectn,length0,length1,location,e,counti;
LNode *L1 = NULL,*L2 = NULL, *L3 = NULL, *la = NULL, *lc = NULL;
printf("请输入新链表长度 :\n");
scanf("%d", &length0);
CreateList_L(&L1, length0);
printf("请选择 : \n");
printf("1 : 插入元素\n");
printf("2 : 删除元素\n");
printf("3 : 合并链表\n");
scanf("%d", &selectn);
switch (selectn)
{
case :
printf("请输入插入位置 :\n");
scanf("%d", &location);
printf("请输入要插入元素 :\n");
scanf("%d", &e);
if(ListInsert_L(L1, location, e) == OK )
{ //逆序输出
counti = ;
la = L1;
printf("新链表的顺序为 :\n");
while(la -> next)
{
la = la->next;
if(counti++ % )
printf("%-5d",la -> data);
else
printf("%-5d\n",la -> data);
}
}
else
printf("插入异常\n");
printf("\n");
break;
case :
printf("请输入要删除的位置 :\n");
scanf("%d",&location);
if(ListDelete_L(L1, location, &e) == OK)
{
printf("删除成功\n被删除元素为 : %-5d\n", e);
}
else
printf("删除异常\n");
break;
case :
printf("请输入链表2 :\n");
printf("请输入链表长度 :\n");
scanf("%d", &length1);
CreateList_L(&L2, length1);
MergeList_L(L1, L2, &L3);
L2 = NULL;
lc = L3 -> next;
printf("新链表顺序为 :\n");
counti = ;
while(lc)
{ if(counti++ % )
printf("%-5d", lc -> data);
else
printf("%-5d", lc -> data);
lc = lc -> next;
}
printf("\n");
break;
default :
printf("ERROR\n");
break;
}
Free(L1);
L1 = NULL;
L3 = NULL;
system("pause");
return ;
}

Data_Struct(LinkList)的更多相关文章

  1. java学习第15天(Linklist Vector)

    根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一   Vector A:有特有功能 a:添加 pub ...

  2. Java自己实现双向链表LinkList

    /** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...

  3. ArrayList和LinkList区别

    ArrayList和LinkList区别 前者是数组的数据结构,后者是链表的数据结构 前者应用于排序和查找,后者应用于插入删除

  4. Java:List,ArrayList和LinkList的区别

    1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...

  5. [置顶] Array ArrayList LinkList的区别剖析

    这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...

  6. ArrayList 、Vector、 LinkList

    public class TestList {     public static void init(List list)     {         if(list!=null)          ...

  7. LinkList Operation

    链表典型数据结构: #define ElemType int typedef struct LinkNode{ ElemType value; struct LinkNode* next; }; 相比 ...

  8. 链表中LinkList L与LinkList *L 借鉴

    链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int el ...

  9. Java集合(2)一 ArrayList 与 LinkList

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...

随机推荐

  1. 优雅的H5下拉刷新【minirefresh】

    序 严格的来说,这是我第一个完全投入的开源项目,它的出现是为了统一移动H5中的下拉刷新,想通过一套框架,多主题拓展方式,适应于任意需求下的任意下拉刷新场景. 另外,这个项目作为独立项目存在,希望能有更 ...

  2. Java 随笔记录

    1. java对象转json Message msg = generateMessage();ObjectMapper mapper = new ObjectMapper();String json ...

  3. CSS基础用法

    [CSS常用选择器] 标签选择器 写法: HTML标签名{}作用: 可以选中页面中,所有与选择器同名的HTML标签. 类选择器(class选择器)写法: .class名{}调用: 在需要调用选择器样式 ...

  4. h5新增html标签语义

    H5新增常用标签<body> <header>...</header> <nav>...</nav> <article> < ...

  5. 搞java的都土鳖

    spring不就几个破框架让人们下载使用吗,但是官网什么都有,就是没有下载链接.java程序员被那些垃圾框架强奸的体无完肤,还乐在其中,还什么SSH,哇哦!java好像跟企业干上了,什么企业bean, ...

  6. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  7. java锁机制

    2.4 锁机制        临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...

  8. 【转】Spring AOP 实现之CGLIB

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp91    cglib(Code Generation Library)是 ...

  9. ROS学习记录(二)————使用smartcar进行仿真(用.xacro文件来运行rviz)

    我发现一个学习ROS系统的好网站: 创客智造http://www.ncnynl.com/ 这里面关于ROS的各个方面都有很详细的介绍. 这周,不,上周我对整个ROS是绝望的,我用一个一个下午的时间在敲 ...

  10. 使用Docker搭建简易的 Java Web 环境

    ![group_5622_0](http://ow20g4tgj.bkt.clouddn.com/2017-09-10-group_5622_0.png) 从[<从最简单的入手学习 Docker ...