链表
1.链表存储结构
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
2.创建链表
链表分为带头结点的链表和不带头节点的链表,不带头节点的链表其LinkList指针直接指向第一个结点,则第一个结点的输入需要单独进行。
//L为LinkList头指针
//此方式为不带头节点的第一个结点的操作
ElemType e;
scanf("%d", &e);
L = (LinkList)malloc(sizeof(LNode));
L->data = e;
LNode *p = L;
//后续再使用p指针进行操作
此函数为带头结点的头插法
LinkList createListByHead(LinkList &L){
/*创建带头节点的链表,头插法*/
LNode *s;
ElemType x;
//1.头节点分配内存
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
//2.输入元素
scanf("%d", &x);
while (x != 9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
此函数为带头结点的尾插法
LinkList createListBytail(LinkList &L){
/*创建带头节点的链表,尾插法*/
ElemType x;
//1.头节点分配内存
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; //尾部指针r,始终指向尾部结点
//2.输入元素
scanf("%d", &x);
while (x != 9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
3.查找结点
在链表中按照序号查找元素,需要使用p指针作为移动指针,且需要判断输入的结点序号是否有效。
此函数为按找结点序号查找元素,返回其结点;
LNode *getElemByPos(LinkList L, int i){
/*在链表中按照序号查找结点*/
int j=1;
//1.初始指针指向第一个数据结点
LNode *p = L->next;
//2.判断是否返回头结点
if (i == 0)
return L;
//3.是否输入结点有效
if (i < 0)
return NULL;
//4.while循环查找元素
while (p){
//判断 i == j
if (i == j)
return p;
p = p->next;
j++;
}
return NULL;
}
此函数为按找结点数据查找元素,返回其结点;
LNode *getElemByValue(LinkList L, ElemType e){
/*在链表中按照值查找结点*/
//1.初始指针指向第一个数据结点
LNode *p = L->next;
//2.while循环查找元素
while (p){
if (p->data == e)
return p;
p = p->next;
}
return NULL;
}
4.插入结点
在插入数据之前需要判断插入位置是否有效,并且需要定义一个查找指针s进行移动查找。
此函数为获取链表长度函数;
int length(LinkList L){
/*获取链表长度*/
int len = 0;
LNode *s = L->next;
while (s){
s = s->next;
len++;
}
return len;
}
此函数为数据插入函数;
bool deleteNode(LinkList &L, int i, ElemType &e){
/*删除i位置的元素,并使用引用返回*/
//1.判断删除位置是否合法
if (i < 1 || i > length(L))
return false;
//2.设置移动指针,找到目标结点
int j = 1;
LNode *q, *p = L;
while (p && j != i){
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
5.删除结点
删除结点也需要对删除位置进行合法性判断,设置查找指针p,同时设置删除结点的指针q。
bool deleteNode(LinkList &L, int i, ElemType &e){
/*删除i位置的元素,并使用引用返回*/
//1.判断删除位置是否合法
if (i < 1 || i > length(L))
return false;
//2.设置移动指针,找到目标结点
int j = 1;
LNode *q, *p = L;
while (p && j != i){
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}