#include<stdio.h>
#include<stdio.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
//#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status CreatLinkList_R(LinkList &L,int n)//尾插法创建单链表
{
L=new LNode;
L->next=NULL;
LinkList r,p;
r=L;
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
//头插法建立单链表
Status CreatLinkList_H(LinkList &L,int n)
{
//逆位序输入n个元素的值,建立带表头节点的单链表L
L=new LNode;
L->next=NULL;
for(int i=0;i<n;i++)
{
LinkList p;
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
return 0 ;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
//在带头结点的单链表L中根据序号i获取元素值,用e返回L中第i个数据元素的值
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
void ListTraverse(LinkList L)
{
//遍历L中的每个元素
if(L==NULL){
printf("null\n");
return ;
}LinkList p=L->next;//p指向开始节点
while(p!=NULL){//若不是链尾继续
putchar(p->data);
p=p->next;//p指向直接后继节点
}
}
void DestroyList(LinkList *L)//销毁单链表L
{
LinkList q,p=*L;//p指向头结点
while(p!=NULL)//若不是链尾继续
{
q=p->next;//指向直接后继节点
free(p);//释放节点存储空间
p=q;//直接后继节点
}
*L=NULL;//置为空表
}
Status ListDelete (LinkList &L,int i)
{
//在带头结点的单链表L中,删除第i个元素
LinkList p=L;
int j=0;
while((p->next)&&(j<i-1))
{
p=p->next;
++j;}
if(!(p->next)||(j>i-1)) return ERROR;//当i>n或i<1时,删除位置不合理
LinkList q;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
Status Displaylist(LinkList L)
{
if(L->next==NULL)
{
printf("空表");
return 0;}
LinkList p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}getchar();}
void main()
{
LinkList H;
LinkList L;
char e='2';
CreatLinkList_R(H,5);
Displaylist(H);
printf("\n");
ListTraverse(H);
printf("\n");
GetElem(H,2,e);
ListDelete(H,2);
Displaylist(H);
printf("\nThe content of list:",H);
DestroyList(&H);
printf("\nThe content of list:");
}