说是话这个实验室考核一个大一学妹写的
汗流浃背了
我只是完善了一下,觉得这个实现的挺不错的
用虚拟头节点作为入口
然后遍历环
#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std;
typedef struct LinkNode
{
int data;
struct LinkNode *next;
} LinkList;
void MainMenu();
bool InitLinkList(LinkList *L); // 初始化
void PrintAll(LinkList *L); // 输出所有元素
void Insert_Order_List(LinkList *L, int e); // 有序插入
int main()
{
LinkList L;
int x;
int element;
if (InitLinkList(&L))
{
cout << "初始化成功" << endl;
}
else
cout << " 初始化失败" << endl;
MainMenu();
while (1)
{
printf("请输入您要执行的操作:");
cin >> x;
switch (x)
{
case 0:
printf("已退出");
exit(0);
break;
case 1:
printf("请输入要插入的值:");
cin >> element;
Insert_Order_List(&L, element);
break;
case 2:
PrintAll(&L);
break;
default:
printf("您输入的操作指令有误!请重新输入!");
}
}
return 0;
}
// 主菜单,显示
void MainMenu()
{
printf("\n\n\n");
printf("\t **** 向有序单链表中插入元素并保持有序 ****\n\n");
printf("\t ------- 0.退出程序\n\n");
printf("\t ------- 1.----有序插入单链表\n\n");
printf("\t ------- 2.----查看单链表\n\n");
printf("\t *************************************\n");
}
// 初始化单链表(带头结点)
bool InitLinkList(LinkList *L)
{
// 先申请一个虚拟头结点
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL;//头节点next指针习惯初始化为NULL
L->data = 0;//头节点的data习惯用来存链表的长度
if (L == NULL)
{
return false;
}
return true;
}
// 打印所有元素
void PrintAll(LinkList *L)
{
LinkList *p;
p = L->next;
int Len = L->data;
while (Len--)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void Insert_Order_List(LinkList *L, int e) // 有序插入
{
LinkList *p = L;
if(L->data==0){ //初始没有元素的时候,直接后加首元节点
LinkList *s = (LinkList *)malloc(sizeof(LinkList));
s->data = e;
p->next = s;
s->next = NULL;
L->data++;
return;
}
if(L->data==1){ //初始一个元素的时候
LinkList *s = (LinkList *)malloc(sizeof(LinkList));
s->data = e;
if(p->next->data<=e){//后插
p->next->next = s;
s->next = p->next;
L->data++;
return;
}else{//前插
s->next = p->next;
p->next = s;
s->next->next = s;
L->data++;
return;
}
}
p = p->next;//通过虚拟头节点进入环
while (1) {
if ((e >= p->data) && (e <= p->next->data)) {
// 申请一个新的结点
LinkList *s = (LinkList *)malloc(sizeof(LinkList));
s->data = e; // 赋值
// 修改指针,将结点s插入到结点p之后
s->next = p->next; // s指针指向
p->next = s;
L->data++;
break; // 插入之后跳出while循环
} else if (p->next == L->next) {
// 如果当前节点的下一个节点是虚拟头节点,说明已经遍历一圈回到起点
// 在这种情况下,将新节点插入到链表尾部,保持有序性
// 申请一个新的结点
LinkList *s = (LinkList *)malloc(sizeof(LinkList));
s->data = e; // 赋值
// 修改指针,将结点s插入到链表尾部
s->next = p->next; // s指针指向
p->next = s;
L->data++;
break; // 插入之后跳出while循环
} else {
p = p->next;
}
}
}