单链表
单链表的操作项与顺序链表的操作箱一致。
区别内容有:
1.单链表的插入与删除
2、单链表的尾插法和头插法
代码
#include<iostream>
#define error 0
#define ok 1
using namespace std;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Lnode,*LinkList;//区别:若定义LinkList L,表示L为单链表的头指针,若定义Lnode *p,则p表示指向单链表中某个节点的指针。
void InitList_L(LinkList &L)//单链表的初始化
{
L = new Lnode;
if (!L)
{
exit(1);
}
L->next = NULL;//为头结点的版本,没有头结点时L=NULL;
}
int ListLength_L(LinkList L)//获取单链表的长度
{
LinkList p;
int length = 0;
p = L->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
int LocateElem_L(LinkList L, ElemType &e)//Lnode *LocateElem_L(LinkList L, ElemType &e)查找某个元素在单链表中的位置
{
LinkList p;
int i = 0;
p = L->next;
while (p && p->data != e)
{
p = p->next;
i++;
}
return i;
}
bool ListInsert_L(LinkList& L, int i, ElemType e)//单链表插入元素
{
LinkList p, s;
s = new Lnode;
p = L;
int j = 0;
while (p && (j < i - 1))
{
p = p->next;
j++;
}
if (!p&&j!=i - 1)
{
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
}
bool ListDelete_L(LinkList& L, int i, ElemType& e)//单链表的删除
{
LinkList p, q;
int j = 0;
p = L;
while ((p->next) && (j < i - 1))//区别于插入操作,是因为插入时有n+1个位置,删除时只有n个元素
{
p = p->next;
j++;
}
if (j !=i-1)
{
return false;
}
q = p->next;
p->next = q->next;
e = q->data;
return true;
}
bool GetElem_L(LinkList& L, int i, ElemType& e)//获取单链表中某个位置的值
{
LinkList p;
p = L;
int j = 0;
while ((p->next) && (j < i))
{
j++;
p = p->next;
}
if (j != i-1)
{
return false;
}
e = p->data;
return true;
}
void CreateList_L_Rear(LinkList& L, ElemType a[], int n)//创建单链表尾插法
{
LinkList p, q;
L = new Lnode;
q = L;
for (int i = 0; i < n; i++)
{
p = new Lnode;
p->data = a[i];
q->next = p;
q = p;
}
q->next = NULL;
}
void CreateList_L_Front(LinkList& L, ElemType a[], int n)//创建单链表头插法
{
LinkList p;
L = new Lnode;
L->next = NULL;
for (int i = 0; i < n; i++)
{
p = new Lnode;
p->data = a[i];
p->next = L->next;
L->next = p;
}
}
void DestroyList_L(LinkList& L)
{
LinkList p, p1;
p = L;
while (p)
{
p1 = p;
p = p->next;
delete p1;
}
L = NULL;
}
void Print_L(LinkList& L)
{
LinkList p;
p = L->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = La;
pc = Lc;
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;
}
}
int main()
{
LinkList list_a,list_b,list_c;
int a[10];
for (int i = 0; i < 10; i++)
{
a[i] = i;
}
CreateList_L_Front(list_a, a, 10);
cout << "采用头插法" << endl;
Print_L(list_a);
CreateList_L_Rear(list_b, a, 10);
cout << "采用尾插法" << endl;
Print_L(list_b);
int num;
GetElem_L(list_a, 5, num);
ListDelete_L(list_a, 5, num);
cout << "list_a表中5号位置的数为:" << num << endl;
Print_L(list_a);
ListInsert_L(list_a, 5, 5);
Print_L(list_a);
cout<<ListLength_L(list_a) << endl;
InitList_L(list_c);
MergeList_L(list_a, list_b, list_c);
Print_L(list_c);
system("pause");
return 0;
}