(三)、单链表
单链表(带头结点)为空的判断条件是 L->next==NULL;
插入(图上)或删除(图下)元素只需改变指针(有头结点的特殊情况也是类似原理,头指针不变):
在一个长度为n(n>1)的带头结点的单链表h上,另设有尾指针r(指向尾结点),执行删除单链表中的最后一个结点操作与链表的长度有关。(该情况删除后尾指针就不知道该指向哪儿了,无关的情况是指不管链表多长都不影响操作设计)
- 建表算法
//单链表建表基本算法之尾插法
void createLinkListR(LNode *&head)
{
head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
LNode *p = NULL,*r = head;
int n;
std::cin>>n; //scanf("%d", &n);
for (int i = 0; i<n; ++i)
{
p = (LNode*)malloc(sizeof(LNode));
p->next = NULL;
std::cin>>p->data; //scanf("%d", &(p->data)); //若有using namespace std则不用写std::
p->next = r->next; //写这个语句就和在中间插入没有区别了,在尾插法中这一步可删除
r->next = p;
r= p;
}
}//用尾插法输入元素12345,则输出为12345
//单链表建表基本算法之头插法
void createLinkListH(LNode *&head)
{
head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
LNode *p = NULL; //头插法中不需要标记尾指针的位置
int n;
std::cin>>n; //scanf("%d", &n);
for (int i = 0; i<n; ++i)
{
p = (LNode*)malloc(sizeof(LNode));
p->next = NULL;
std::cin>>p->data; //scanf("%d", &(p->data)); //若有using namespace std则不用写std::
p->next = head->next; //把在尾结点之后插入一个结点改为在头结点之后插入一个结点
head->next = p; //头插法的头指针不需要移动
}
} //用头插法输入元素12345,则输出为54321
- 逆置
//逆置p->next到q之间的结点
while(p->next!= q)
{
t = p->next;
p->next = t->next;
t->next = q->next;
q->next = t;
}
- 求最值
//求最大值
LNode *p, *q;
int max = head->next->data;
q=p=head->next;
while (p != NULL)
{
if (max < p->data)
{
max = p->data;
q= p;
}
p = p->next;
}
//求最小值
LNode *p, *q;
int min = head->next->data;
q=p=head->next;
while (p != NULL)
{
if (min > p->data)
{
max = p->data;
q= p;
}
p = p->next;
}