目录
1.线性表的属性设置
//链表的属性设置
typedef int ElemType;//定义ElemType为int
typedef struct LNode* Point;//定义point为结构体指针
struct LNode {
ElemType data;
Point next;
};
typedef Point List;//用List表示链表的头节点指针
typedef Point Position;//用Position表示指向某个节点的指针
2.线性表的初始化
//初试化链表
void initlist(List &L)//引用传递
{
L = (Position)malloc(sizeof(struct LNode));//为头结点分配空间,头指针指向头节点,两者地址一样,所以L->next指向第一个元素
if (L==NULL)
{
cout << "初试化失败" << endl;
exit(1);//防御性措施,防止出现 “取消对NULL指针的引用”的警告
}
else
{
cout << "初试化成功" << endl;
}
L->next = NULL;
}
3.获取线性表的长度
//获得链表的长度
int getlength(List L)
{
int length = 0;
Position p = L->next;//p指向当前第一个元素
while (p)
{
p = p->next;
length++;
}
return length;
}
4.按位序查找值
//按序号查找(返回当前序号的值)
ElemType findwithindex(List L, int index)
{
Position p = L->next;
int length = 1;//已遍历的长度
while (p && length < index)
{
p = p->next;
length++;
}
if (p && length == index)//已找到返回当前元素的值
{
return p->data;
}
else//未找到返回标志位-1
{
return -1;
}
}
5.按值查找位序
//按值查找(返回当前值的序号)
ElemType findwithvalue(List L, ElemType value)
{
Position p = L->next;
int length = 1;
while (p && p->data != value)
{
p = p->next;
length++;
}
if (p && p->data == value)
{
return length;
}
else
{
return NULL;//表示没有找到
}
}
6.插入元素到链表中
//将元素插入到链表中(新)
void insertlist2(List& L, ElemType value, int index)
{
Position p = L;
int j = 0;
while (p != NULL && j < index - 1)
{
p = p->next;
j++;
}
if (p == NULL || j > index - 1)
{
cout << "插入元素失败" << endl;
exit(1);
}
Position temp = (Position)malloc(sizeof(struct LNode));
if (temp == NULL)
{
cout << "初试化失败" << endl;
exit(1);//防御性措施,防止出现 “取消对NULL指针的引用”的警告
}
temp->data = value;
temp->next = p->next;
p->next = temp;
cout << "插入元素成功" << endl;
}
7.按位序删除
//在表中删除元素,位序按(单链表上插入、删除一个节点时,需要知道这个节点之前的一个节点(前驱节点))
void deletelist(List &L, int index)
{
Position p, temp;
p = L;
int length = 0;
while (p && length < index - 1)
{
p = p->next;
length++;
}
if (!p || length != index - 1 || p->next == NULL)
{
cout << "删除元素失败" << endl;
}
else
{
temp = p->next;
p->next = p->next->next;
free(temp);
cout << "删除成功" << endl;
}
}
8.按值删除
//按值删除元素(仍需找到待删除元素的前驱节点)
void delete_withvalue(List& L, int value)
{
Position temp;
Position p = L->next;//第一个节点
Position p_last = L;//头结点
while (p && p->data != value)//循环结束时p为当前删除的元素,p_last为其前驱节点
{
p_last = p;
p = p->next;
}
if (!p || p->data != value )
{
cout << "删除元素失败" << endl;
}
else
{
temp = p_last->next;
p_last->next = p_last->next->next;
free(temp);
cout << "删除成功" << endl;
}
}
9.清空链表
//清空链表
void cleanlist(List &L)
{
Position p;
p = L->next;//p指向链表的第一个节点
while (p)
{
Position q;
q = p;
p = p->next;
free(q);
}
L->next = NULL;
cout << "链表已清空" << endl;
}
10.判断链表是否为空
//判断链表是否为空
bool isEmpty(List L)
{
if (L->next== NULL)
{
return true;
}
else
{
return false;
}
}
11.逆转链表
//逆转链表(三指针法)
void reverselist(List& L)
{
Position p1, p2, p3;
p1 = L;
p2 = L->next;
while (p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
L->next ->next= NULL;//使原来的第一个节点(逆转后为最后一个节点)指向NULL
L ->next= p1;
}
12.显示链表中的所有节点
//显示链表中的所有内容
void showlist(List L)
{
Position p = L->next;
cout << "线性表的内容如下" << endl;
while (p)
{
cout << p->data << " ";
p = p->next;
}
}