编辑代码

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

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;
}



//(1)尾插法建立单链表
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;
}


//(2)查找操作
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;
}

//(3)插入操作
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;
}

//(4)	删除
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;
}

//(5)删除链表中的重复结点
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;
}

//(6)删除偶数结点 输出所有结点
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;
}


//(7)		查找单链表中最大元素和最小元素 并输出
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;
}

//(8)反转单链表
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);
/*
	printf("请输入要查找的数据:");
	scanf("%d", &num);
	loc = LinkListLocate(head, num);
	if (loc == 0)
		printf("没找到!\n");
	else
		printf("\n找到了!数据%d是链表的第%d个结点\n", num, loc);
	printf("\n请输入要删除的结点的位置:");
	scanf("%d", &loc);
	LinkListDelete(head, loc);
	printf("\n删除这个结点后的链表是:\n");
	LinkListPrint(head);	
*/
	LinkListDeleteRepeatElem(head);//递归
	printf("删除重复结点后的链表是:\n");
	LinkListPrint(head);

	LinkListDeleteEvenElem(head);//递归
	printf("\n删除偶数项之后的链表是:\n");
	LinkListPrint(head);
//	LinkListMaxMin(head);

	LinkListReverse(head);
	printf("\n反转链表后的结点是:\n");
	LinkListPrint(head);
	return 0;
}