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

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

 #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. 面试 | 商汤科技面试经历之Promise红绿灯的实现

    说在前面 说实话,刚开始在听到这个面试题的实话,我是诧异的,红绿灯?这不是单片机.FPGA.F28335.PLC的实验吗?! 而且还要用Promise去写,当时我确实没思路,只好硬着头皮去写,下来再r ...

  2. Stream-快速入门Stream编程

    1.什么是流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执 ...

  3. Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

    最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据. 查询了很多资料终于实现,现进行总结. ------------------------------------------- ...

  4. C++中4个类型转换相关的关键字/特点/应用场合

    reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型:能够将任何的整数类型转换成指针类型,反之亦然:滥用reinterpret_cast强制类 ...

  5. sqlserver优化

    有些程序员在撰写数据库应用程序时,常专注于 OOP 及各种 framework 的使用,却忽略了基本的 SQL 语句及其「性能 (performance)优化」问题.版工曾听过台湾某半导体大厂的新进程 ...

  6. 理解 angular 的路由功能

    相信很多人使用angular 都是因为他路由功能而用的 深入理解ANGULARUI路由_UI-ROUTER 最近在用 ionic写个webapp 看到几个demo中路由有好几种,搞的有点晕,查下资料研 ...

  7. Visual Studio2017数据库数据比较

    一.前言 上一篇文章我们介绍了如何使用VS2017对SSMS数据库进行架构比较.这一篇文章我们将继续介绍如何对SSMS数据库的数据进行比较.数据的比较也是很常见的,比如我们要比较当前版本的数据库相对上 ...

  8. ReentrantLock和synchronized的性能对比

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo8 ReentrantLock和内部锁的性能对比     Reentran ...

  9. JavaScript: 使用 atan2 来绘制 箭头 和 曲线

    最近搞Canvas绘图,知道了JavaScript中提供了atan2(y,x)这样一个三角函数.乍眼一看,不认识,毕竟在高中时,学过的三角函数有:sin,cos,arcsin,arccos,tan,a ...

  10. java伪代码《大道至简》

    阅读<大道至简>第一章,深感作者对编程问题的精炼定义,通过对古老寓言故事<愚公移山>的引用,说明了编程的本质,即顺序,分支,循环.其中又将他们扮演的项目组织者,团队经理,编程人 ...