typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode* next;
}LNode;
LNode* LinkListInit()
{
LNode* L;
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return NULL;
L->next = NULL;
return L;
}
int LinkListCreate(LNode* L)
{
int i = 1;
LNode* p = L, * q = L;
int x;
printf("请输入第%d个数据的值(以0结束)", i);
scanf("%d", &x);
while (x != 0)
{
p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return 0;
p->data = x;
p->next = NULL;
q->next = p;
q = p;
i++;
printf("请输入第%d个数据的值(以0结束)", i);
scanf("%d", &x);
}
L->data = i - 1;
return 0;
}
extern int LinkListPrint(LNode* L)
{
LNode* p = L;
while (p->next != NULL)
{
p = p->next;
printf("%3d", p->data);
}
printf("\n\n链表的长度是(用L->data表示):%d\n", L->data);
printf("-----------------------------------\n");
return 0;
}
int LinkListLocate(LNode* L, int num)
{
int j = 1;
LNode* p;
p = L->next;
while (p != NULL && p->data != num)
{
p = p->next;
++j;
}
if (p->data == num && p == NULL)
return j;
else if (p->next == NULL && p->data != num)
return 0;
else
return j;
}
int LinkListInsert(LNode* L, int i, ElemType num)
{
if (i < 1 || i>L->data + 1)
return 0;
int j = 0;
LNode* p, * q;
p = L;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
q = (LNode*)malloc(sizeof(LNode));
if (q == NULL)
return 0;
q->data = num;
q->next = p->next;
p->next = q;
L->data += 1;
printf("插入元素后的链表是:\n");
LinkListPrint(L);
return 0;
}
int LinkListDelete(LNode* L, int i)
{
int j = 0;
LNode* q, * p;
p = L;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
free(q);
L->data -= 1;
return 0;
}
int LinkListDeleteRepeatElem(LNode* L)
{
LNode* p,*q;
int i = 1,j,flage=0;
p = L->next;
while (p != NULL)
{
q = L->next;
j = 1;
while (q != NULL)
{
if (p->data == q->data && i != j)
{
LinkListDelete(L, j);
flage = 1;
break;
}
j++;
q = q->next;
}
if (flage == 1)
break;
p = p->next;
i++;
}
if (p == NULL)
return 0;
LinkListDeleteRepeatElem(L);
return 0;
}
int LinkListDeleteEvenElem(LNode* L)
{
LNode* p;
int i = 1;
p = L->next;
while (p!= NULL)
{
if (p->data % 2 == 0)
{
LinkListDelete(L, i);
break;
}
p = p->next;
i++;
}
if (p == NULL)
return 0;
LinkListDeleteEvenElem(L);
return 0;
}
int LinkListMaxMin(LNode* L)
{
LNode* p = L->next;
ElemType Max = p->data;
ElemType Min = p->data;
while (p->next != NULL)
{
p = p->next;
if (Max < p->data)
Max = p->data;
if (Min > p->data)
Min = p->data;
}
printf("\n单链表中最大的元素是:Max=%d,最小的元素是:Min=%d\n", Max, Min);
return 0;
}
int LinkListReverse(LNode* L)
{
LNode* p, * q;
p = L->next;
q = p->next;
L->next = NULL;
while (p != NULL)
{
p->next = L->next;
L->next = p;
p = q;
if (p != NULL)
q = p->next;
}
return 0;
}
int main()
{
int num, loc;
LNode* head;
head = LinkListInit();
LinkListCreate(head);
printf("原始链表:\n");
LinkListPrint(head);
LinkListDeleteRepeatElem(head);
printf("删除重复结点后的链表是:\n");
LinkListPrint(head);
LinkListDeleteEvenElem(head);
printf("\n删除偶数项之后的链表是:\n");
LinkListPrint(head);
LinkListReverse(head);
printf("\n反转链表后的结点是:\n");
LinkListPrint(head);
return 0;
}