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

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


#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→下))

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