/* 链表销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的结点销毁了,这样这个链表就不能再使用了。
链表清空的时候,是先保留了链表的头,然后把头后面的所有的结点都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 20
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode;
typedef struct LNode *LinkList;
//初始化或重置链表
int ResetList(LinkList *L) {
LinkList p,q;
p=(*L)->next;
while(p) {
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
cout<<"重置成功!"<<endl;
return OK;
}
//销毁链表
int DestroyList(LinkList *L) {
if(!(*L)) {
cout<<"链表不存在!"<<endl;
return FALSE;
} else {
LinkList q;
while(*L) {
q=(*L)->next;
free(*L);
*L=q;
}
cout<<"销毁成功!"<<endl;
return OK;
}
}
//链表中数据元素个数
int ListLength(LinkList L) {
if(!L) {
cout<<"链表不存在!"<<endl;
return FALSE;
} else {
LinkList e;
int num=0;
e=L->next;
while(e) {
num++;
e=e->next;
}
return num;
}
}
//所指位序的元素值
int GetElem(LinkList L,int locate,ElemType *e) {
int j=1;
LinkList p;
p=L->next;
while(p && j<locate) {
p=p->next;
++j;
}
if( !p || j>locate) {
cout<<"该位序不存在!"<<endl;
return ERROR;
}
*e=p->data;
cout<<"第"<<locate<<"个元素为:"<<*e<<endl;
return OK;
}
//链表已存在元素的位序
int LocateElem(LinkList L,ElemType e) {
int i=0;
LinkList p=L->next;
while(p) {
i++;
if( p->data == e ) return i;
p=p->next;
}
return ERROR;
}
//请输入元素,求直接前驱
int PriorElem(LinkList L,ElemType cur_e,LinkList *pre_e) {
*pre_e=L->next;
int a,num=1;
a=LocateElem(L,cur_e);
// cout<<a<<endl;
if(a==0) {
cout<<"元素"<<cur_e<<"不存在!"<<endl;
return OVERFLOW;
} else if(a==1) {
cout<<"元素"<<cur_e<<"没有前驱!"<<endl;
return OVERFLOW;
} else {
while(pre_e && num<(a-1)) {
*pre_e=(*pre_e)->next;
++num;
}
if(num==(a-1)) {
cout<<"元素"<<cur_e<<"的前驱为:"<<(*pre_e)->data<<endl;
return OK;
}
}
}
//第二种方法
// if(pre_e->data == cur_e){
// cout<<"元素"<<cur_e<<"没有前驱!"<<endl;
// return OVERFLOW;
// }
// else{
// while(pre_e->next){
// if(pre_e->next->data == cur_e){
// cout<<"元素"<<cur_e<<"的前驱为:"<<pre_e->data<<endl;
// return OK;
// }
// else{
// pre_e=pre_e->next;
// }
// }
// cout<<"元素"<<cur_e<<"不存在!"<<endl;
// return OVERFLOW;
// }
//请输入元素,求直接后继
int NextElem(LinkList L,ElemType cur_e, LinkList next_e) {
next_e=L->next;
int a,num=1;
a=LocateElem(L,cur_e);
// cout<<ListLength(L)<<endl;
if(a==0) {
cout<<"元素"<<cur_e<<"不存在!"<<endl;
return OVERFLOW;
} else if(a==ListLength(L)) {
cout<<"元素"<<cur_e<<"没有后驱!"<<endl;
return OVERFLOW;
} else {
while(next_e && num<(a+1)) {
next_e=next_e->next;
++num;
}
if(num==(a+1)) {
cout<<"元素"<<cur_e<<"的后驱为:"<<next_e->data<<endl;
}
}
return OK;
}
//第二种方法:
// while(next_e){
// if(next_e->data == cur_e){
// cout<<"元素"<<cur_e<<"的后驱为:"<<next_e->next->data<<endl;
// return OK;
// }
// else{
// next_e=next_e->next;
// }
// if(next_e->next == 0){
// cout<<"元素"<<cur_e<<"没有后驱!"<<endl;
// return OVERFLOW;
// }
// }
// cout<<"元素"<<cur_e<<"不存在!"<<endl;
// return OVERFLOW;
//在第i个位置插入元素
int ListInsert(LinkList *L,int i,ElemType e) {
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i) {
p = p->next;
++j;
}
if (!p || j > i) {
cout<<"插入失败!"<<endl;
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
cout<<"插入成功!"<<endl;
return OK;
}
//删除第i个元素
int ListDelete(LinkList *L,int i,ElemType *e) {
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) {
p = p->next;
++j;
}
if (!(p->next) || j > i) {
cout<<"删除失败!"<<endl;
return ERROR;
}
q = p->next;
p->next = q->next; /* 将q的后继赋值给p的后继 */
*e = q->data; /* 将q结点中的数据给e */
free(q); /* 让系统回收此结点,释放内存 */
cout<<"删除成功!"<<endl;
return OK;
}
//输出所输入的链表元素
int ListTraverse(LinkList L) {
if(!L) {
cout<<"链表不存在!"<<endl;
return FALSE;
} else {
LinkList e;
e=L->next;
while(e) {
cout<<e->data<<" ";
e=e->next;
}
cout<<endl;
return OK;
}
}
//初始化并输入链表元素(尾插法!!!!!)
int InitList(LinkList *L) {
LinkList rear,p;
(*L)=(LinkList)malloc(sizeof(LNode));
if(!(*L)) {
cout<<"初始化失败!"<<endl;
return ERROR;
}
rear=*L;
int num;
while(scanf("%d",&num) != EOF ) {
if(num<0) break;
p=(LinkList)malloc(sizeof(LNode));
p->data=num;
rear->next=p;
rear = p;
}
rear->next=NULL;
return OK;
}
int main() {
LinkList L=NULL,pre_e,next_e;
int locate;
ElemType e,cur_e;
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.在第i个位置插入元素 *******************"<<endl;
cout<<"************* 9.删除第i个元素 *******************"<<endl;
cout<<"************* 10.输出所输入的链表元素 *******************"<<endl;
cout<<"************* 11.初始化并输入链表元素 *******************"<<endl;
cout<<"************* 12.退出 *******************"<<endl;
cout<<"************************************************************"<<endl;
cout<<endl<<"请输入你的选择:";
int num;
while(scanf("%d",&num)!= EOF) {
switch(num) {
case 1:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
ResetList(&L);
cout<<"请输入链表元素(以一个负数结尾):";
InitList(&L);
cout<<endl<<"请输入你的选择:";
break;
}
case 2:
DestroyList(&L);
cout<<endl<<"请输入你的选择:";
break;
case 3:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"链表中数据元素个数为:"<<ListLength(L)<<endl;
cout<<endl<<"请输入你的选择:";
break;
}
case 4:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入一个位序数:";
cin>>locate;
GetElem(L,locate,&e);
cout<<endl<<"请输入你的选择:";
break;
}
case 5:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入需要查询的元素:";
cin>>e;
cout<<"元素"<<e<<"的位序为:"<<LocateElem(L,e)<<endl;
cout<<endl<<"请输入你的选择:";
break;
}
case 6:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入需要查询前驱的元素:";
cin>>cur_e;
PriorElem(L,cur_e,&pre_e);
cout<<endl<<"请输入你的选择:";
break;
}
case 7:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入需要查询后驱的元素:";
cin>>cur_e;
NextElem(L,cur_e,next_e);
cout<<endl<<"请输入你的选择:";
break;
}
case 8:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入需要插入的位序和元素:";
cin>>locate>>e;
ListInsert(&L,locate,e);
cout<<endl<<"请输入你的选择:";
break;
}
case 9:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"请输入需要删除的位序:";
cin>>locate;
ListDelete(&L,locate,&e);
cout<<endl<<"请输入你的选择:";
break;
}
case 10:
if(!L) {
cout<<"链表不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
cout<<"该链表元素为:";
ListTraverse(L);
cout<<endl<<"请输入你的选择:";
break;
}
case 11:
cout<<"请输入链表元素(以一个负数结尾):";
InitList(&L);
cout<<endl<<"请输入你的选择:";
break;
case 12:
return 0;
break;
default:
cout<<"该数据无效,请重新输入:";
break;
}
}
return 0;
}