#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<iomanip>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;//定义元素类型
typedef int Status;
typedef struct LNode{//单链表的存储结构
ElemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;
Status InitList(LinkList &L);//初始化单链表
void CreateList_H(LinkList &L,int n);//创建单链表(头插法)
void CreateList_R(LinkList &L,int n);//创建单链表(尾插法)
void OutList(LinkList L);//输出单链表
Status GetElem(LinkList L,int i,ElemType &e);//取值 获取第i个元素的值并存在e中
LinkList LocateElem(LinkList L,ElemType e);//查找 元素e的地址并返回
Status ListInsert(LinkList &L,int i,ElemType e);//在第i个位置插入值为e的新结点
Status ListDelete(LinkList &L,int i);//删除第i个位置的结点
int main(){
LinkList L;
InitList(L);
/*int n;
cin>>n;
CreateList_H(L,n);//头插法 逆序 */
int n;
cin>>n;
CreateList_R(L,n);
/*int i;
ElemType e;
cin>>i;
GetElem(L,i,e);
cout<<e;*/
/*ElemType e;
cin>>e;
LinkList p=LocateElem(L,e);
cout<<p;*/
/*int i;
ElemType e;
cin>>i>>e;
ListInsert(L,i,e);*/
/*int i;
cin>>i;
ListDelete(L,i); */
OutList(L);
return 0;
}
Status InitList(LinkList &L)//初始化单链表
{
L=new LNode;//生成新结点作为头结点,用头指针L指向头结点
L->next=NULL;//头结点的指针域置空
return OK;
}
void CreateList_H(LinkList &L,int n)//创建单链表(头插法) 先后再前,要握手
{
L=new LNode;//建立一个带头结点的空链表
L->next=NULL;
LinkList p;
for(int i=0;i<n;i++)
{
p=new LNode;//生成新节结点 *p
cin>>p->data;
p->next=L->next;L->next=p;//将新结点*p插入到头结点后
}
}
void CreateList_R(LinkList &L,int n)//创建单链表(尾插法)
{
L=new LNode;//建立一个带头结点的空链表
L->next=NULL;
LinkList p,r;
r=new LNode;
r=L;//生成尾结点r,指向头结点
for(int i=0;i<n;i++)
{
p=new LNode;//生成新节结点 *p
cin>>p->data;
p->next=NULL;r->next=p;//将新结点*p插入尾结点*r之后
r=p; //r指向新的尾结点*p
}
}
void OutList(LinkList L)//输出单链表
{
LinkList p;//生成新节结点 *p
p=new LNode;
p=L->next;//*p指向首结点
while(p)//p为非空
{
cout<<p->data<<" ";
p=p->next;
}
}
Status GetElem(LinkList L,int i,ElemType &e)//取值 获取第i个元素的值并存在e中
{
LinkList p;//生成新节结点 *p
p=new LNode;
p=L->next;//*p指向首结点
int j=1;
while(p&&j<i)//p为非空 找到第i-1个元素位置
{
p=p->next;
j++;
}
e=p->data;
return OK;
}
LNode *LocateElem(LinkList L,ElemType e)//查找 元素e的地址并返回
{
LinkList p;//生成新节结点 *p
p=new LNode;
p=L->next;//*p指向首结点
while(p&&p->data!=e)//p为非空 数据不为e
p=p->next;
return p;//查找成功返回e的地址p 失败返回NULL
}
Status ListInsert(LinkList &L,int i,ElemType e)//在第i个位置插入值为e的新结点
{
LinkList p;//生成新节结点 *p
p=new LNode;
p=L;
int j=0;
while(p&&j<i-1)//p为非空 找到第i-1个元素位置
{
p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;//i>n+1ori<1
LinkList s;
s=new LNode;//生成新节结点 *p 用来储存数据
s->data=e;
s->next=p->next;
p->next=s;//将结点*p的指针域指向结点*s
return OK;
}
Status ListDelete(LinkList &L,int i)//删除第i个位置的结点
{
LinkList p;//生成新节结点 *p
p=new LNode;
p=L;
int j=0;
while(p&&j<i-1)//p为非空 找到第i-1个元素位置
{
p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;//i>n+1ori<1
LinkList s;
s=new LNode;//生成新节结点 *p 用来储存数据
s=p->next;
p->next=s->next;//将结点*p的指针域指向结点*s后的结点
delete s;
return OK;
}