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

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

 #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. Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新

    需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...

  2. PowerShell 脚本执行策略

    为防止恶意脚本的执行,PowerShell 中设计了一个叫做执行策略(Execution Policy)的东西(我更倾向于把它叫做脚本执行策略).我们可以在不同的应用场景中设置不同的策略来防止恶意脚本 ...

  3. 【渗透课程】第一篇-Web渗透需要接触的语言

    ---恢复内容开始--- 上一篇我们讲过了,Web渗透的基本原理,在原理中我们也提到了Web应用程序(脚本语言),本章就谈到了Web渗透要涉及的语言. 涉及语言: 1.html:是前段语言的其中一个, ...

  4. HTML 输入类型

    HTML 输入类型 输入类型 本章描述 <input> 元素的输入类型. 输入类型:text <input type="text"> 定义供文本输入的单行输 ...

  5. Python练习28

    [之前发布到本人的51cto博客,现转过来] 无意看到老男孩的博文:合格linux运维人员必会的30道shell编程面试题及讲解 http://oldboy.blog.51cto.com/256141 ...

  6. centos 7 最小安装后 安装FTP服务器 vsftp

    1.首先查看下 系统配置 rpm -q ftp #肯定是没安装, 2.安装 vsftpd yum -y vsftpd 3.vim /etc/vsftpd/vsftpd.conf anonymous_e ...

  7. Linux平台 Oracle 12cR2 RAC安装Part1:准备工作

    Linux平台 Oracle 12cR2 RAC安装Part1:准备工作 一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二 ...

  8. jdbc hibernate myBatis比较

    jdbc hibernate myBatis比较 jdbc 优点:性能高,易掌握 缺点:代码繁琐 hibernate 优点:不用写sql,代码简洁 缺点:性能不好 自动生成的sql效率低下(复杂业务) ...

  9. sleep(强制等待)和implicitly_wait(隐式等待 )区别与理解---基于python

    我们在进行selenium页面自动化的测试的时候,由于需要等待目标页面的加载或由于网络或硬件配置导致的页面加载等待,经常会用到sleep,但是由于在不同场景下对于sleep时间的估计无法十分准确,导致 ...

  10. Winform控件输入的字母转换成大写

    private void textBoxHbh_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar >= 'a' & ...