下面展示 完整代码
。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
LinkList CreatList(LinkList * L)
{
LNode *s;
int x;
(*L) = (LinkList) malloc(sizeof(LNode));
(*L)->next = NULL;
printf("请输入要插入的元素,以9999结束(头插法):");
scanf("%d", &x);
while (x != 9999)
{
s = (LNode *) malloc(sizeof(LNode));
s->data = x;
s->next = (*L)->next;
(*L)->next = s;
scanf("%d", &x);
}
}
//反转链表:需要一个新的空链表存摘下来的结点
LinkList resever(LinkList * L)
{
LNode *p, *q;
LinkList L1;//注意不能写成*L1,为啥目前不知道
L1= (LNode *) malloc(sizeof(LNode));
L1->next = NULL;
p = (*L);
q = p->next;
while (q != NULL)
{
p->next = q->next;
q->next = L1->next;
L1->next = q;
q = p->next;
}
*L = L1;
return *L;
}
/*LinkList resever(LinkList * L, LinkList * L1)
{
LNode *p, *q;
p = (*L);
q = p->next;
while (q != NULL)
{
p->next = q->next;
q->next = (*L1)->next;
(*L1)->next = q;
q = p->next;
}
//*L = *L1;
return *L1;
}*/
//反转链表:王道书的原地逆置
LinkList Reverse(LinkList * L)
{
LNode *p, *r;
p = (*L)->next;
(*L)->next = NULL;
while (p != NULL)
{
r = p->next;
p->next = (*L)->next;
(*L)->next = p;
p = r;
}
return *L;
}
LinkList RemoveDupNode(LinkList * L)
{ // 删除重复结点的算法
LNode *p, *q, *r;
p = (*L)->next;
while (p) // p用于遍历链表
{
q = p;
while (q->next) // q遍历p后面的结点,并与p数值比较
{
if ((q->next->data == p->data) || (q->next->data == -(p->data))) // 删除绝对值相同的
{
r = q->next; // r保存需要删掉的结点
q->next = r->next; // 需要删掉的结点的前后结点相接
free(r);
} else
q = q->next;
}
p = p->next;
}
}
//将两个有序的链表合成一个
LinkList Union(LinkList * L, LinkList * L1)
{
LNode *p, *q, *r, *s;
p = *L;
q = *L1;
r = p->next;
s = q->next;
while (s)
{
while (r)
{
if (s->data < r->data)
{
q->next = s->next;
s->next = r;
p->next = s;
s = q->next;
p = p->next;
} else
{
r = r->next;
p = p->next;
}
}
p->next = s;
break;
}
}
void PrintList(LinkList * L)
{
LinkList p;
p = (*L)->next;
while (p != NULL)
{
printf("%3d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L, L1;
CreatList(&L);
/*L1= (LNode *) malloc(sizeof(LNode));
L1->next = NULL;
resever(&L, &L1);
*/
// CreatList(&L1);
// RemoveDupNode(&L);
// Union(&L, &L1);
PrintList(&L);
resever(&L);
//Reverse(&L);
PrintList(&L);
}