有需求者可自提代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotProsent 4
#define Duplicate 5
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void Init(LinkList L) //链表的初始化
{
int i =1;
LinkList p, q;
p = L;
int n;
printf("请输入n和n个数据元素:\n");
scanf_s("%d", &n);
while (n--)
{
q = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个数据:", i);
i++;
scanf_s("%d",&q->data);
q->next = NULL;
p->next = q;
p = q;
}
}
void Print(LinkList L)
{
int num = 0;
LinkList p;
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
num++;
}
printf("\n长度为%d\n", num);
}
void Delete(LinkList L, ElemType x) //删除链表中某元素
{
LinkList p, q = NULL;
p = L;
while (p && x != p->data)
{
q = p;
p = p->next;
}
if (p == NULL)
{
printf("没有此数据!\n");
}
else
{
q->next = p->next;
free(p);
printf("删除成功!!\n");
}
}
void Reverse(LinkList L) // 将链表元素逆置,类似于头插法建立列表
{
LinkList p1, p2;
p1 = p2 = L->next;
L->next = NULL;
while (p1) //头插法开始
{
p2 = p2->next;
p1->next = L->next;
L->next = p1;
p1 = p2;
}
printf("逆置成功!\n");
}
void InsertHigh(LinkList L, ElemType data) //升序的情况下插入
{
LinkList p1, p2=NULL,p;
p = (LinkList)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
p1 = L;
while (p1 && p1->data <= data)
{
p2 = p1;
p1 = p1->next;
}
p2->next = p;
p->next = p1;
}
void Sort(LinkList L)
{
LinkList p1, p2=NULL;
p1 = L->next;
L->next = NULL;
/*
while (p1)
{
p2 = p1;
p1 = p1->next;
p2->next = NULL;
InsertHigh(L, p2->data);
}*/
while(p1)
{
InsertHigh(L, p1->data);
p1 = p1->next;
}
printf("升序排列成功!\n");
}
void InsertLow(LinkList L, ElemType data) //降序的情况下插入
{
LinkList p1, p2 = NULL, p;
p = (LinkList)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
p1 = L;
while (p1 && (p1->data==-1||p1->data>=data)) //p1->data不是头结点的元素,并且大于data才能执行下一步
{
p2 = p1;
p1 = p1->next;
}
p2->next = p;
p->next = p1;
}
void Find(LinkList L, ElemType data) //查找某元素的前后驱节点
{
LinkList p1, p2 = NULL;
p1 = L;
while (p1 && p1->data != data)
{
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
printf("你想查找的元素不存在");
}
else
{
if (p1->next == NULL)
{
printf("%d的前驱节点数据为:%d\t无后驱节点\n", p1->data, p2->data);
}
else if (p2->data == -1)
{
printf("%d无前驱结点\t 后驱节点数据为%d\n", p1->data, p1->next->data);
}
else
{
printf("%d的前驱节点数据为:%d\t 后驱节点数据为%d\n", p1->data, p2->data, p1->next->data);
}
}
}
void Release(LinkList L)
{
LinkList p1, p2 = NULL;
p1 = L->next;
while (p1)
{
p2 = p1;
p1 = p1->next;
free(p2);
}
printf("链表释放成功!\n");
}
void Tips() {
printf("按数字进行以下的相应操作:\n");
printf("查询当前链表的全部数据----1\n");
printf("查找某元素的前后驱节点----2\n");
printf("按升序方法插入一个元素----3\n");
printf("按降序方法插入一个元素----4\n");
printf("删除链表某一项数据元素----5\n");
printf("当前链表的所有元素逆置----6\n");
printf("按升序方法排列链表元素----7\n");
printf("退出程序------------------0\n");
}
int main()
{
int data, op;
LinkList L;
L = (LinkList)malloc(sizeof(Node));
L->data = -1;
L->next = NULL;
Init(L);
Print(L);
Tips();
printf("请输入你的选择: ");
scanf_s("%d", &op);
while (op)
{
switch (op)
{
case 1:
Print(L);
break;
case 2:
printf("请输入你想查询的元素: ");
scanf_s("%d", &data);
Find(L, data);
break;
case 3:
printf("请输入你想插入的值: ");
scanf_s("%d", &data);
InsertHigh(L, data);
printf("插入成功!");
break;
case 4:
printf("请输入你想插入的值: ");
scanf_s("%d", &data);
InsertLow(L, data);
printf("插入成功!");
break;
case 5:
printf("请输入你想删除的值: ");
scanf_s("%d", &data);
Delete(L, data);
break;
case 6:
Reverse(L);
break;
case 7:
Sort(L);
break;
default:
break;
}
printf("请再次做出选择:\n");
scanf_s("%d", &op);
}
Release(L);
return 0;
}
代码运行程序如下:
其它各种操作可复制自行运行的结果。