// main.cpp
#include <iostream>
using namespace std;
#include "Status.h"
#include "LinkList.h"
int main()
{
LinkList L;
int n,i;
ElemType e;
InitList(L);
cout<<" L=";
ListTraverse(L);
cout<<" 请设置将向线性表L中输入的元素个数:";
cin>>n;
CreateList(L,n);
cout<<" L=";
ListTraverse(L);
cout<<" L的表长为:"<<ListLength(L)<<endl;
cout<<" 请输入想要获取的元素位序:";
cin>>i;
if(GetElem(L,i,e)) cout<<" 第"<<i<<"个元素为:"<<e<<endl;
else cout<<" 第"<<i<<"个元素不存在!"<<endl;
cout<<" 请输入要查找的元素:";
cin>>e;
if((i=(LocateElem(L,e)))) cout<<" 元素"<<e<<"的位置为:"<<i<<endl;
else cout<<" 元素"<<e<<"不存在!"<<endl;
cout<<" 请输入插入位置和所插入元素:";
cin>>i>>e;
if(ListInsert(L,i,e))
{
cout<<" L=";
ListTraverse(L);
}
else cout<<" 插入操作失败!"<<endl;
cout<<" 请输入被删元素的位置:";
cin>>i;
if(ListDelete(L,i,e)) cout<<" 被删元素为:"<<e<<endl;
else cout<<" 删除操作失败!"<<endl;
cout<<" L=";
ListTraverse(L);
return 0;
}
// Status.h
#ifndef yuan_Status_h
#define yuan_Status_h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#endif
// LinkList.h
#ifndef yuan_LinkList_h
#define yuan_LinkList_h
typedef struct LNode{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode,*LinkList; //LinkList为指向结构体LNode的指针类型
//1.单链表的初始化
Status InitList(LinkList &L)
{ //构造一个空的单链表
L=new LNode; //生成新结点作为头结点,用头指针L指向头结点
L->next=NULL; //头结点的指针域制空
return OK;
}
//2.单链表的创建
//2.1前插法创建单链表
void CreateList(LinkList &L,int n)
{//逆位序输入n个元素的值,创建带头结点的单链表L
L=new LNode;
LinkList p;
L->next=NULL; //先建立一个带头结点的空链表
cout<<" 请输入"<<n<<"个元素:";
for (int i=n; i>0; i--) {
p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=L->next; L->next=p; //插入到表头
}
}
//3.单链表的遍历
void ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p) {
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//4.单链表的长度
Status ListLength(LinkList L){
LinkList p;int j=0;
p=L->next;
while(p) {
j++;
p=p->next;
}
return j;
}
//5.单链表的插入
Status ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p=L,s; int j=0;
while (p&&j<i-1) {p=p->next;++j;}
if (!p||j>i-1) return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//6.单链表的删除
Status ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList p=L,q;int j=0;
while (p->next&&j<i-1){p=p->next;++j;}
if (!(p->next)||j>i-1) return ERROR;
q=p->next;
p->next=q->next;
delete p;
return OK;
}
//7.单链表的按序号查找
Status GetElem(LinkList L,int i,ElemType &e)
{//在带头结点的单链表L中查找第i个元素
LinkList p;int j=1;p=L->next; //初始化,p指向第一个结点,j为计数器
while (p&&j<i) {p=p->next;++j;}
if (!p||j>i) return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}
//8.单链表的按值查找
Status LocateElem(LinkList L,ElemType e)
{
LinkList p;int j=1;
p=L->next;
while (p&&j<=ListLength(L)) {
if(p->data==e) return j;
p=p->next;++j;
}
if (!p||j>ListLength(L)) return ERROR;
return OK;
}
////8.单链表的按值查找
//LNode *LocateElem(LinkList L,ElemType e)
//{
// LinkList p=L->next;
// while (p&&p->data!=e)
// p=p->next;
// return p;
//}
#endif