单链表的头插、尾插、删除、合并等操作

单链表的头插、尾插、删除、合并等操作实现代码如下:


#include<iostream>

using namespace std;


//单链表的存储结构

typedef struct Node

{

int data;

struct Node* next;

}Node,*LinkList;//LinkList为结构指针类型


//初始化单链表

void InitList(LinkList *L)

{

*L = (LinkList)malloc(sizeof(Node));//建立头结点

(*L)->next = NULL;//建立空的单链表L

}


//L是带头结点的空链表头指针,通过键盘输入表中元素值,利用头插法建单链表L

void CreateFromHead(LinkList L)

{

Node *s;

char c;

int flag = 1;

while (flag)//flag初值为1,当输入'$'时,置flag为0,建表结束

{

c = getchar();

if (c != '$')

{

s = (Node*)malloc(sizeof(Node));//建立新结点s

s->data = c;

s->next = L->next;//将s结点插入表头

L->next = s;

}

else

{

flag = 0;

}

}

}


//L是带头结点的空链表头指针,通过键盘输入表中元素值,利用尾插法建单链表L

void CreateFromFail(LinkList L)

{

Node *r,*s;

r=L;//r指针动态指向链表的当前表尾,以便做尾插入,其初值指向头结点

int flag = 1;

char c;

while (flag)//flag初值为1,当输入'$'时,置flag为0,建表结束

{

c = getchar();

if (c != '$')

{

s = (Node*)malloc(sizeof(Node));//建立新结点s

s->data = c;

r->next = s;

r = s;

}

else

{

flag = 0;

r->next = NULL;//将最后一个结点的next链域置为空,表示链表结束 

}

}

}


//在带头结点的单链表L中查找第i个结点,若找到(1<=i<=n),则返回该结点的存储位置,否则返回NULL

Node *Get(LinkList L, int i)

{

int j = 0;

Node *p;

if (i <= 0)

{

return NULL;

}

p = L;

while ((p->next != NULL) && (j < i))

{

p = p->next;//扫描下一结点

j++;//已扫描结点计数器

}

if (i == j)

{

return p;//找到了第i个结点

}

else

{

return NULL;

}

}


//在带头结点的单链表L中查找其结点值等于key的第1个结点,若找到则返回该结点的存储位置p,否则返回NULL

Node *Locate(LinkList L, int key)

{

Node *p;

p = L->next;//从表中第一个结点开始

while (p!= NULL) //当前表未查完

{

if (p->data!=key)

{

p = p->next; 

}

else

{

break;//找到结点值等于key时退出循环

}

}

return p;

}


//求带头结点的单链表L的长度

int ListLength(LinkList L)

{

Node *p;

p = L->next;

int j = 0;//用来存放单链表的长度

while (p != NULL) 

{

p = p->next;

j++;

}

return j;//j为求得的单链表的长度

}


//在带头结点的单链表L中第i个位置插入值为e的新结点,n个元素有n+1个插入位置

#define OK 1

#define ERROR 0


void InsList(LinkList L, int i, int e)

{

Node *pre, *s;

int k = 0;

if (i<=0) //判断插入位置是否合法

{

cout << "插入位置i值不合法!" << endl;

return (ERROR);

}

pre = L;

while (pre != NULL&&k < (i - 1))//表未查完且未查到第i-1个元素时重复,若找到pre指向第i-1个

{

pre = pre->next;

k = k + 1;

}

if (!pre)//若当前位置pre为空表,已找完还未找到第i个,说明插入位置不合理

{

cout << "插入位置不合理!" << endl;

return (ERROR);

}

s = (Node*)malloc(sizeof(Node));//申请一个新结点s

s->data = e;//值e置入s的数据域

s->next = pre->next;//修改指针,完成插入操作

pre->next = s;

return (OK);

}


//在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中

void DelList(LinkList L, int i, int *e)

{

Node *pre, *r;

int k = 0;

pre = L;

while (pre->next != NULL&&k < (i - 1))//寻找被删除结点i的前驱结点i-1,使p指向它

{

pre = pre->next;

k = k + 1;

}

//while循环是因为pre->next=NULL或i<1而跳出来的,因为pre->next=NULL,没有找到合法的前驱位置,说明删除位置i不合法

if (!(pre->next))

{

cout << "删除结点的位置i不合理!" << endl;

return (ERROR);

}

r= pre->next; 

pre->next=r->next;//修改指针,删除结点r

*e=r->data ;

free(r);//释放被删除结点所占的内存空间

return (OK);

}


//将递增有序的单链表LA和LB,合并成一个递增有序的单链表LC

LinkList MergeLinkList(LinkList LA, LinkList LB)

{

Node *pa, *pb,*r;

LinkList LC;//将Lc初始置为空表,pa和pb分别指向单链表LA和LB中的第一个结点,r初值为LC且r始终指向LC的表尾

pa = LA->next;

pb = LB->next;

LC = LA;

LC->next = NULL;

r = LC;

//当两个表中均未处理完时,比较选择将较小值结点插入到新表LC中

while ((pa != NULL) && (pb != NULL))

{

if (pa->data <= pb->data)

{

r->next= pa;

r = pa;//pa变成新的r结点

pa=pa->next;

}

else

{

r->next = pb;

r = pb;

pb = pb->next;

}

}

if (pa)//当表LA有剩余元素时,则将表LA的剩余元素链到新表LC表尾

{

r->next = pa;

}

else//否则将表LB的剩余元素链到新表LC表尾

{

r->next = pb;

}

free(LB);

return (LC);

}


本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1771244

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构单链表入、删除和修改实验报告 一、实验目的 1.理解数据结构中带结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表入、删除和查询算法的设计与JAVA实现。 4.熟练掌握简单的演示菜单与人机交互设计方法。 二、实验内容 1. 编制一个演示单链表入、删除、查找等操作的程序。 三、实验步骤 1.需求分析 本演示程序用JAVA编写,完成单链表的生成,任意位置的入、删除,以及确定某一元素在单链表中的位置。 ① 输入的形式和输入值的范围:入元素时需要输入入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有三种操作中都显示操作是否正确以及操作单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。   ③ 程序所能达到的功能:完成单链表的生成(通过操作)、入、删除、查找操作。 ④ 测试数据:  A. 操作依次输入11,12,13,14,15,16,生成一个单链表    B. 查找操作依次输入12,15,22返回这3个元素单链表中的位置    C. 删除操作依次输入2,5,删除位于2和5的元素 2.概要设计 1)为了实现上述程序功能,需要定义单链表的抽象数据类型:   ADT LinkList {    数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}    数据关系:R={|ai,ai+1 ∈D}    基本操作: (1)insert 初始化状态:单链表可以不为空集;操作结果:入一个空的单链表L。   (2)decelt     操作结果:删除已有的单链表的某些结点。 (3)display     操作结果:将上述输入的元素进行排列显示。    (4)modify     操作结果:将上述输入的某些元素进行修改。    (5)save     操作结果:对上述所有元素进行保存。    (6)load     操作结果:对上述元素进行重新装载。   }   2)本程序包含7个函数:   ① 主函数main()   ② 保存单链表函数save()   ③ 重载操作菜单函数load()   ④ 显示单链表内容函数display ()   ⑤ 入元素函数insert ()   ⑥ 删除元素函数decelt ()   ⑦ 修改元素函数modify()   各函数间关系如下: 3.详细设计   实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。   1) 结点类型和指针类型   typedef struct node {    int data;    struct node *next;   }Node,*singleLIST.java;   2) 单链表的基本操作   为了方便,在单链表中设结点,其data域没有意义。 bool insert(singleLIST) (伪码算法)   bool modify(singleLIST) (伪码算法)   void delect(singleLIST)   (伪码算法)   void display()   (伪码算法) 3) 其他模块伪码算法 4.调试分析   (略) 5.使用说明 程序名为 ,运行环境为Windows。程序执行后显示   ========================   0----EXIT   1----INSERT   2----DELETE   3----DISPLAY 4----MODIFY 5----EXIST =======================   SELECT:   在select后输入数字选择执行不同的功能。要求首输入足够多的入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择5:退出程序   选择1:显示"INSERT =" ,   要求输入要入的位置和元素的值(都是整数)。   选择2:显示"DELETE =" ,   要求输入要删除元素的位置,执行成功后返回元素的值。   选择3:显示"MODIFY = " , 选择要修改的对象,执行成功后返回新的元素值。 选择4:显示"DIAPLAY= "   显示所有单链表中的元素,自动进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值