# include<iostream>
# include<stdio.h>
# include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status; //操作状态类型
typedef int ElemType; //数据元素类型
//定义单链表结点结构体
typedef struct Node{
ElemType data;
struct Node *next;
}ListNode,*LinkList;
//函数声明
Status InitList(LinkList*L);
Status DestroyList(LinkList *L);
Status ClearList(LinkList L);
int ListLength(LinkList L);
Status GetElem(LinkList L,int i,ElemType*e);
Status LocateElem(LinkList L,ElemType e,int*pos);
Status PriorElem(LinkList L,ElemType cur_e,ElemType*pre_e);
Status NextElem(LinkList L,ElemType cur_e,ElemType*next_e);
Status ListInsert(LinkList L,int i,ElemType e);
Status ListDelete(LinkList L,int i,ElemType *e);
void PrintList(LinkList L);
Status CreateList_Tail(LinkList*L,int n);
Status ReverseList(LinkList L);
Status SortList(LinkList L);
//初始化或重置
Status InitList(LinkList *L){
if(*L !=NULL){
DestroyList(L); //若已存在则先销毁
}
*L = (LinkList)malloc(sizeof(ListNode));
if (!(*L)) return ERROR;
(*L)->next = NULL;
return OK;
}
//销毁
Status DestroyList(LinkList*L){
if(*L == NULL) return ERROR;
ClearList(*L);
free(*L);
*L = NULL;
return OK;
}
//清空(保留头结点)
Status ClearList(LinkList L){
if(L == NULL) return ERROR;
ListNode *p = L->next,*q;
while(p){
q = p;
p = p->next;
free(q);
}
L->next = NULL;
return OK;
}
//链表长度
int ListLength(LinkList L){
if (L == NULL) return 0;
int len = 0;
ListNode *p = L->next;
while(p){
len++;
p = p->next;
}
return len;
}
//获取第i个元素
Status GetElem(LinkList L,int i,ElemType *e){
if (L == NULL || i < 1) return ERROR;
ListNode *p = L->next;
int j = 1;
while (p && j < i){
p = p->next;
j++;
}
if (!p) return ERROR;
*e = p->data;
return OK;
}
//查找元素的位序
Status LocateElem(LinkList L,ElemType e,int*pos){
if (L == NULL) return ERROR;
ListNode *p = L->next;
int j = 1;
while (p){
if (p->data == e){
*pos = j;
return OK;
}
p = p->next;
j++;
}
return ERROR;
}
//求直接前驱
Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e){
if (L == NULL || L->next == NULL) return ERROR;
ListNode *p = L->next;
if (p->data == cur_e) return ERROR; //第一个元素无前驱
while(p->next != NULL){
if (p->next->data == cur_e){
*pre_e = p->data;
return OK;
}
p = p->next;
}
return ERROR; //元素不存在
}
//求直接后继
Status NextElem(LinkList L,ElemType cur_e,ElemType*next_e){
if (L == NULL || L->next ==NULL) return ERROR;
ListNode *p = L->next;
while(p != NULL && p->next != NULL){
if(p->data == cur_e){
*next_e = p->next->data;
return OK;
}
p = p->next;
}
return ERROR;
}
//在第i个位置插入元素
Status ListInsert(LinkList L,int i,ElemType e){
if (L == NULL || i < 1 || i > ListLength (L) + 1) return ERROR;
ListNode *p = L;
int j = 0;
while(p && j < i - 1){
p = p->next;
j++;
}
if (!p) return ERROR;
ListNode *s = (ListNode*)malloc(sizeof(ListNode));
if (!s) return ERROR;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除第i个元素
Status ListDelete(LinkList L,int i,ElemType *e){
if (L == NULL || i < 1 || i > ListLength(L)) return ERROR;
ListNode *p = L;
int j = 0;
while(p->next && j < i - 1){
p = p->next;
j++;
}
if (!p->next) return ERROR;
ListNode *q = p->next;
*e = q->data;
p->next = q->next;
free(q);
return OK;
}
//输出链表元素
void PrintList(LinkList L){
ListNode *p = L->next;
while(p){
printf("%d" ,p->data);
p = p->next;
}
}
//尾插法建表
Status CreateList_Tail(LinkList *L, int n){
if (*L != NULL) DestroyList(L);
if (InitList(L) != OK) return ERROR;
ListNode *q = *L;
for (int i = 0; i < n; i++) {
ListNode *p = (ListNode*)malloc(sizeof(ListNode));
scanf("%d", &p->data);
p->next = NULL;
q->next = p;
q = q->next;
}
return OK;
}
//逆序排放
Status ReverseList(LinkList L){
if (L == NULL || L->next == NULL || L->next->next == NULL) return OK;
ListNode *p = L->next; //p指向第一个数据节点
L->next = NULL; //头结点暂时断开与原链表的链接
while(p){
ListNode *q = p; //保存当前节点p
p = p->next; //p移至下一个节点
q->next = L->next; //将p插入到头结点之后
L->next = q; //头结点指向q
}
return OK;
}
//排序(冒泡排序)
Status SortList(LinkList L){
if (L == NULL||L->next == NULL||L->next == NULL) return OK;
int swapped;
ListNode *p,*end = NULL;
do{
swapped = 0;
p = L->next;
while (p->next != end){
if (p->data > p->next->data){
ElemType temp = p->data;
p->data = p->next->data;
p->next->data = temp;
swapped = 1;
}
p = p->next;
}
end = p;
}while (swapped);
return OK;
}
int main()
{
LinkList L = NULL;
int i,e,pos,result;
int n = 1;//退出菜单的标记
cout<<"====欢迎使用链表运算小工具~~===="<<endl;
cout<<"++输入对应数字指令实现相应功能++"<<endl;
cout<<"********1---初始化或重置链表********"<<endl;
cout<<"********2---销毁链表********"<<endl;
cout<<"********3---清空链表********"<<endl;
cout<<"********4---链表长度********"<<endl;
cout<<"********5---指定位置的元素值******"<<endl;
cout<<"********6---链表已存在元素的位序******"<<endl;
cout<<"********7---求输入元素的直接前驱******"<<endl;
cout<<"********8---求输入元素的直接后继******"<<endl;
cout<<"********9---在第i个位置插入一个元素******"<<endl;
cout<<"********10---删除第i个元素******"<<endl;
cout<<"********11---输出有的链表元素******"<<endl;
cout<<"********12---初始化并用尾插法输入元素******"<<endl;
cout<<"********13---实现单链表的逆序存放******"<<endl;
cout<<"********14---实现单链表的排序******"<<endl;
cout<<"*****输入一个负数退出程序~*****"<<endl;
while(n){//n不等于0 n!=0
int s; //选菜单
cout<<"请输入指令编号,(退出时输入负数):\n";
scanf("%d",&s);
switch(s){
case 1:
if(InitList(&L) == OK){
printf("链表初始化成功\n");
}else{
printf("初始化失败\n");
}
break;
case 2:
if(DestroyList(&L) == OK){
printf("链表已成功销毁\n");
}else{
printf("链表不存在或尚未初始化,无法销毁\n");
}
break;
case 3:
if (L == NULL){
printf("链表尚未初始化,请先初始化\n");
}else if(ClearList(L) == OK){
printf("链表已清空\n");
}else{
printf("清空失败\n");
}
break;
case 4:
if(L == NULL){
printf("链表尚未初始化\n");
}else{
n = ListLength(L);
printf("当前链表长度为:%d\n",n);
}
break;
case 5:
if (L == NULL){
printf("链表尚未初始化\n");
}else{
printf("请输入位置i:");
scanf("%d",&i);
if (GetElem(L,i,&e) == OK){
printf("第%d个元素是:%d\n",i,e);
}else{
printf("位置无效,",i,ListLength(L));
}
}
break;
case 6:
if(L == NULL){
printf("链表未初始化\n");
}else{
printf("请输入要查找的元素:");
scanf("%d",&e);
if (LocateElem(L,e,&pos) == OK){
printf("元素%d首次出现在第%d位\n",e,pos);
}else{
printf("元素%d不在链表中\n",e);
}
}
break;
case 7:
if (L == NULL){
printf("链表未初始化\n");
}else{
printf("请输入要求前驱的元素:");
scanf("%d",&e);
if(PriorElem(L,e,&result) == OK){
printf("元素%d的前驱是:%d\n",e,result);
}else{
if(ListLength(L) == 0){
printf("链表为空,无前驱\n");
}else if(L->next->data == e){
printf("元素%d是第一个元素,无前驱\n",e);
}else{
printf("该元素不在链表中\n");
}
}
}
break;
case 8:
if (L == NULL) {
printf("链表未初始化。\n");
} else {
printf("请输入要求后继的元素: ");
scanf("%d", &e);
if (NextElem(L, e, &result) == OK) {
printf("元素%d的后继是: %d\n", e, result);
} else {
n = ListLength(L);
GetElem(L, n, &result);
if (result == e) {
printf("元素%d是最后一个元素,没有后继。\n", e);
} else {
printf("元素%d不在链表中,无法求后继。\n", e);
}
}
}
break;
case 9:
if (L == NULL) {
printf("链表未初始化,请先初始化。\n");
} else {
printf("请输入插入位置i和元素e (i e): ");
scanf("%d %d", &i, &e);
if (ListInsert(L, i, e) == OK) {
printf("成功在第%d个位置插入元素%d。\n", i, e);
} else {
printf("插入失败\n");
}
}
break;
case 10:
if (L == NULL) {
printf("链表未初始化。\n");
} else {
printf("请输入要删除的位置i: ");
scanf("%d", &i);
if (ListDelete(L, i, &e) == OK) {
printf("已删除第%d个元素,其值为%d。\n", i, e);
} else {
printf("删除失败");
}
}
break;
case 11:
if (L == NULL) {
printf("链表未初始化。\n");
} else if (ListLength(L) == 0) {
printf("链表为空。\n");
} else {
printf("链表元素为: ");
PrintList(L);
printf("\n");
}
break;
case 12:
printf("请输入元素个数n: ");
scanf("%d", &n);
printf("请输入元素:");
if (CreateList_Tail(&L, n) == OK) {
printf("使用尾插法成功创建含%d个元素的链表。\n", n);
} else {
printf("内存分配失败,创建失败。\n");
}
break;
case 13:
if (L == NULL) {
printf("链表未初始化。\n");
} else if (ListLength(L) <= 1) {
printf("链表长度小于2,无需逆序。\n");
} else {
if (ReverseList(L) == OK) {
printf("链表逆序成功。\n");
} else {
printf("逆序失败。\n");
}
}
break;
case 14:
if (L == NULL) {
printf("链表未初始化。\n");
} else if (ListLength(L) <= 1) {
printf("链表长度小于2,无需排序。\n");
} else {
if (SortList(L) == OK) {
printf("链表排序成功(升序)。\n");
} else {
printf("排序失败。\n");
}
}
break;
default:
if(s<0){
n = 0;
cout<<"程序退出成功,欢迎下次使用~~"<<endl;
break;
}
else
cout<<"您输入的指令有误,请重新输入~"<<endl;
}//switch
}//while
}//main 修改,为什么清空链表后再显示长度会结束运行
最新发布