1.假设单链表L=(a1,b1,a2,b2,---,an,bn),设计算法实现L1=(a1,a2,---,an) L2=(bn,bn-1,----b1)
void split(LinkNode*& L, LinkNode*& L1, LinkNode*& L2) {
LinkNode* p = L->next, * q, * r1;
L1 = L;
r1 = L1;
L2 = (LinkNode*) malloc(sizeof(LinkNode));
while (p!=NULL) {
r1->next = p;
r1 = p;
p = p->next;
q = p->next;
p->next = L2->next;
L2->next = p;
p = q;
}
r1->next = NULL;
}
2.设计一个算法,删除L中元素最大的节点
void delmaxnode(LinkNode*& L) {
LinkNode* p = L->next, * pre = L, * maxp = p, * maxpre = pre;
while (p != NULL) {
if (maxp->data < p->data) {
maxp = p;
maxpre = pre;
}
pre = p;
p = p->next;
}
maxpre->next = maxp->next;
free(maxp);
}
3.有一个带头结点的单链表L,使其元素递增有序排列
int ListLocate_L(LinkNode* L, int x)
{
LinkNode* p = L;
int i = 1;
while (p->next != NULL)
{
p = p->next;
if (p->data == x)
return i;
i++;
}
return NULL;
}
4.单链表插入节点:
bool ListInsert(LinkNode * &L, int i, int e){
int j = 0;
LinkNode* p = L, * s;
while (j < i - 1 && p != NULL) {
j++;
p = p->next;
}if (p == NULL) {
return false;
}
else {
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
5.单链表删除节点:
bool ListDelete(LinkNode*& L, int i, int& e) {
int j = 0;
LinkNode* p = L,*q;
if (i < 0) return false;
while (j < i - 1 && p != NULL) {
j++;
p = p->next;
}
if (p == NULL) return false;
else {
q = p->next;
if (q == NULL) {
return false;
}e = q->data;
p->next = q->next;
free(q);
return true;
}
}