#include<iostream.h>
#define null 0;
#define OK 1;
#define ERROR 0;
typedef int Status;
typedef struct Node{//定义单链表存储结构
int data;
struct Node *next;
}Node,*LinkList;
Status lnitList(LinkList &L)//初始化单链表
{
L=new Node;
L->next=null;
return OK;
}
bool ListEmpty(LinkList &L)//判空
{
if(L->next) return false;
else
return true;
}
Status CreatListTail(LinkList &L, int n){//尾插法
LinkList p,r;
int i;
r = L;
for (i = 0; i < n; i++) {
p = new Node;
cin>>p->data;
p->next=null;
r->next = p;
r = p;
}
r->next = NULL;
return OK;
}
Status CreatListHead(LinkList &L, int n){//头插法
LinkList p;
int i;
for (i = 0; i < n; i++) {
p = new Node; // 生成新节点
cin>>p->data;
p->next = L->next;
L->next = p;
}
return OK;
}
void PrintList(LinkList L)//输出
{
LinkList p;
p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//取值
Status GetElem(LinkList L, int i){
int e;
int j;
LinkList p; // 声明指针p
p = L->next; // p指向链表L的第一个结点
j = 1; // 当前位置计数器设置为1
while (p && j<i) { // 当p不为空 切j<i时候 j继续向后找
p = p->next;
j++;
}
if (!p || j>i) return ERROR; // 到达结尾且没找到
e = p->data; // 获取倒找的结果
return e;
}
//插入
Status ListInsert(LinkList &L, int i, int e){
int j;
LinkList p,s;
p = L;
j = 1;
while (p && j<i) { // 用于寻找第i个结点
p = p->next;
j++;
}
if (!p || j>i) return ERROR; // 到达结尾且没找到
s = new Node; //生成一个空节点s
// 插入语句
s->data=e;
s->next = p->next;
p->next = s;
return OK;
}
//删除
Status ListDelete(LinkList &L, int i){
int j;
LinkList p,q;
p = L;
j = 1;
while (p && j<i) { // 用于寻找第i个结点
p = p->next;
j++;
}
if (!p || j>i) return ERROR; // 到达结尾且没找到
q = p->next;
// 删除语句
p->next = q->next;
delete q;
return OK;
}
void ClearList(LinkList &L){
LinkList p;
while (L->next) {
p=L->next;
L->next=p->next;
delete p;
}
}
//销毁
void DestroyList(LinkList &L)
{
LinkList p;
while(L)
{
p=L;
L=L->next;
delete p;
}
}
//表长
int LisLength(LinkList L)
{
int count=0;
LinkList p;
p=L->next;
while(p)
{
count++;
p=p->next;
}
return count;
}
//返回位序
int LocalteElem(LinkList L,int e)
{
LinkList p;
p=L->next;
int i=1;
while(p&&p->data!=e)
{
p=p->next;i++;
}
return i;
}
void InversionList(LinkList &L){//逆置
Node *p,*q;
p=L->next;
L->next=null;
while(p){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
void main()
{
LinkList L;
lnitList(L);
cout<<"20-8软工2-9-115"<<endl;
if(ListEmpty(L))cout<<"初始化单链表"<<endl;
cout<<"输入预计元素个数"<<endl;
int i,j,x;;
cin>>i;
cout<<"---创建单链表---"<<endl;
cout<<"---1.头插法---"<<endl;
cout<<"---2.尾插法---"<<endl;
cin>>j;
switch(j)
{
case 1:CreatListHead(L,i);break;
case 2:CreatListTail(L,i);break;
}
cout<<"输出表:";PrintList(L);
cout<<"表长为"<<LisLength(L)<<endl;
bool one=1;
while(one){
cout<<endl;
cout<<"请输入将要进行的操作"<<endl;
cout<<"1.删除表中元素"<<endl;
cout<<"2.往表中插入元素"<<endl;
cout<<"3.读取表中第i个元素"<<endl;
cout<<"4.按值查找"<<endl;
cout<<"5.进行逆置运算"<<endl;
cout<<"6.退出"<<endl;
cin>>j;
switch(j)
{
case 1:cout<<"删除第几个元素?";
cin>>i;ListDelete(L,i);cout<<"输出表:";PrintList(L);
cout<<"表长为"<<LisLength(L)<<endl;break;
case 2:cout<<"第几个位置插入?";
cin>>i;
cout<<"插入的元素为?";
cin>>x;ListInsert(L,i,x);cout<<"输出表:";PrintList(L);
cout<<"表长为"<<LisLength(L)<<endl;break;
case 3:cout<<"查找第几个";cin>>i;
cout<<"第"<<i<<"个元素的值为"<<GetElem(L,i)<<endl;break;
case 4:cout<<"要查找的元素的值为?";cin>>x;
cout<<x<<"在表中的位序为"<<LocalteElem(L,x)<<endl;break;
case 5:InversionList(L);cout<<"输出表:";PrintList(L);
cout<<"表长为"<<LisLength(L)<<endl;break;
case 6:one=0;break;
}
}
ClearList(L);
cout<<"清空后,表长为:"<<LisLength(L)<<endl;
DestroyList(L);
}