单链表的头插、尾插、删除、合并等操作实现代码如下:
#include
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=https://www.yisu.com/zixun/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=https://www.yisu.com/zixun/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 & lt;我)
{
p=p→下;//扫描下一结点
j + +,//已扫描结点计数器
}
如果(i==j)
{
返回p;//找到了我第个结点
}
其他{
返回NULL;
}
}
//在带头结点的单链表L中查找其结点值等于关键的第1个结点,若找到则返回该结点的存储位置p,否则返回零*
节点定位(LinkList L, int键)
{
节点* p;
p=L→下;//从表中第一个结点开始
, (p !=NULL)//当前表未查完
{
如果(p→数据!=键)
{
p=p→下一;,
}
其他{
打破;//找到结点值等于关键时退出循环
}
}
返回p;
}
//求带头结点的单链表L的长度
int ListLength (LinkList L)
{
节点* p;
p=L→下;
int j=0;//用来存放单链表的长度
, (p !=NULL),
{
p=p→下;
+ +;
}
返回j;//j为求得的单链表的长度
}
//在带头结点的单链表L中第i个位置插入值为e的新结点,n个元素有n + 1个插入位置
#定义好的1
#定义错误0
空白InsList (LinkList L, int, int e)
{
节点*前,*年代;
int k=0;
如果(i<=0)//判断插入位置是否合法
{
cout & lt; & lt;“插入位置我值不合法!”& lt; & lt;endl;
返回(误差);}
=L;以前
, (pre !=NULL&及k & lt;(- 1))//表未查完且未查到张第个元素时重复,若找到指前向张第个
{
=以前前→下;
k=k + 1;
}
如果之前(!)//若当前位置前为空表,已找完还未找到第个,说明插入位置不合理
{
cout & lt; & lt;“插入位置不合理!”& lt; & lt;endl;
返回(误差);}
s=(节点*)malloc (sizeof(节点));//申请一个新结点
年代→数据=https://www.yisu.com/zixun/e;//e值置入年代的数据域
s→下=前→下;//修改指针,完成插入操作
前→下=s;
返回(OK);}
//在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量* e中
空白DelList (LinkList L, int, int * e)
{
节点*前,* r;
int k=0;
=L;以前
, (pre→下一个!=NULL&和k & lt;(- 1))//寻找被删除结点我的前驱结张点,使p指向它
{
=以前前→下;
k=k + 1;
}
//而循环是因为前→下=NULL或i<1而跳出来的,因为前→下=NULL,没有找到合法的前驱位置,说明删除位置我不合法
如果(! (pre→下))