写的有点水,别介意哈!!
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define MAXSIZE 100 //链表可能达到的最大长度
typedef struct LNode
{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //linkList为指向结构体LNode的指针类型
Status InitList(LinkList &L) //算法2.6 单链表的初始化
{
//构造一个空的单链表L
L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
L->next = NULL; //头结点的指针域置空
return OK;
}
Status DestroyList(LinkList &L)
{
/* 初始条件:线性表L已存在。操作结果:销毁线性表L */
LinkList q;
while(L)
{
q = L->next;
delete L;
L = q;
}
return OK;
}
int ListLength(LinkList L)
{
/****在此下面完成代码***************/
int j=0;
L=L->next;//这个链表头是没有存数据的
while(L)
{
j++;
L=L->next;
}
return j;
/***********************************/
}
bool ListEmpty(LinkList L)
{
/****在此下面完成代码***************/
return !(L->next);//因为链表头都是存在的,要看他下一位有没有存数据才行
/***********************************/
}
Status GetElem(LinkList L, int i, ElemType &e) //算法2.7 单链表的取值
{
/****在此下面完成代码***************/
int j=0;
if(i<1||i>ListLength(L))return 0;//如果小于1或者大于长度,想取也取不到
while(L&&j<i) //因为后面的L=L->next,所以找到i-1位即可,循环里面就到i位了
{
L=L->next;
j++;
}
e=L->data;
return 1;
/***********************************/
} //GetElem
int LocateElem(LinkList L, int e) //略有改动 算法2.8 按值查找
{
/****在此下面完成代码***************/
int j=1;
L=L->next;//链表头无数据
while(L)
{
if(L->data==e)
{
return j;//找到了就直接返回去
break;
}
j++;
L=L->next;
}
return 0;//循环结束都没找到,返回0
/*************************************/
} //LocateElem
Status ListInsert(LinkList &L, int i, ElemType e) //算法2.9 单链表的插入
{
/****在此下面完成代码***************/
if(i<1||i>ListLength(L)+1)return 0;//插入是可以再末尾的,所以可以是长度加1
LNode *h=L,*p;//L是引用,那就保持他的链表头,用h在他的后面搞事情吧
int j=0;
while(h&&j<i-1)//j是到i前面两个空间的,因为还要一次循环,之后就是i前一个空间了
{
h=h->next;
j++;
}
p=new LNode;//分配一个结点,把他插到i-1和i之间
p->data=e;//数值
p->next=h->next;//把h后面的先接到p后面,这样就是p后有一串链了
h->next=p;//然后再把p接到h的后面就OK了
return 1;
/***********************************/
} //ListInsert
Status ListDelete(LinkList &L, int i) //算法2.10 单链表的删除
{
/****在此下面完成代码***************/
int j=0;
if(i<1||i>ListLength(L))return 0;//同样,小于1或者大于长度的也没值给你去删嘛
LNode *h=L;//L不动他,咱动他后面的
while(h&&j<i-1)//到i前两个位置,因为还有一次循环,循环之后就是i前一个空间了
{
h=h->next;
j++;
}
h->next=h->next->next;//我们找到i前一个空间,把i后面的空间接给他,那i不就没有了吗
return 1;
/***********************************/
} //ListDelete
void ListPrint(LinkList L)
{
LNode *p;
for(p = L->next; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
int i;
ElemType e;
LinkList L;
string op;
InitList(L);
while(cin >> op)
{
if(op == "Empty")
cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;
else if(op == "Insert")
{
cin >> i >> e;
if(ListInsert(L, i, e) == ERROR)
cout << "Insert failed" << endl;
else
ListPrint(L);
}
else if(op == "Length")
{
cout << "List length is " << ListLength(L) << endl;
}
else if(op == "GetElem")
{
cin >> i;
if(GetElem(L, i, e) == ERROR)
cout << "Out of index" << endl;
else
cout << "The elem at position " << i << " is " << e << endl;
}
else if(op == "LocateElem")
{
cin >> e;
i = LocateElem(L, e);
if(i == 0)
cout << e << " is not found in list" << endl;
else
cout << e << " is found at the position " << i << endl;
}
else if(op == "Delete")
{
cin >> i;
if(ListDelete(L, i) == ERROR)
cout << "Delete failed" << endl;
else
ListPrint(L);
}
}
DestroyList(L);
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务