//打印
void ListPrint(LNode* C)
{
LNode* cur = C->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
}
//尾插法
LNode* creatlistR(LNode* L)
{
LNode* s, * r;
int a[5] = { 1,12,34,42,58 };
int i;
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
{
printf("Error\n");
exit(-1);
}
r = L;
for (i = 0; i < 5; i++)
{
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
{
printf("Error\n");
exit(-1);
}
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
return L;
}
//头插法
LNode* creatlistF(LNode* D)
{
int a[5] = { 14,27,32,49,51 };
LNode* s;
int i;
D = (LNode*)malloc(sizeof(LNode));
D->next = NULL;
for (i = 0; i < 5; i++)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
s->next = D->next;
D->next = s;
}
return D;
}
//不改变链表的前提下,找出单链表的倒数第k个结点的值
int Find(LNode* C, int k)
{
LNode* p = C->next;
LNode* q = C->next;
int i;
for (i = 1; i < k; i++)
{
q = q->next;
if (q == NULL)
return -1;
}
while (q->next != NULL)
{
p = p->next;
q = q->next;
}
// q先动移动k-1次 与p保持k-1个距离 q和p同时移动 直到q的next到null结束
return p->data;
}
//逆序带头结点的单链表--------方法和头插法类似
LNode* reverseList(LNode* L)
{
LNode* q;
LNode* p = L->next;
L->next = NULL;
while(p!=NULL)
{
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
return L;
}
//两个链表归并为一个非递减有序链表
LNode* merge(LNode* A, LNode* B)
{
LNode* C;
LNode* p = A->next;
LNode* q = B->next;
LNode* r; //记录产生的链表的位置
C = A;
r = C;
C->next = NULL;
while (q != NULL && p != NULL)
{
if (q->data <= p->data)
{
r->next = q;
q = q->next;
r = r->next;
}
else
{
r->next = p;
p = p->next;
r = r->next;
}
}
r->next = NULL;
if (p != NULL)r->next = p;
if (q != NULL)r->next = q;
return C;
}
//删除带头节点的单链表最小的节点(最小唯一)
LNode* DelMinNode(LNode* L)
{
if (L == NULL || L->next == NULL)
return -1;
LNode* p = L->next;
LNode* pre = L;
LNode* min = p;
LNode* premin = L;
while (p != NULL)
{
if (p->data < min->data)
{
min = p;
premin = pre;
}
pre = p;
p = p->next;
}
premin->next = min->next;
free(min);
return L;
}