#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
/* 定义单链表数据 */
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;
/* 单链表的初始化 */
void InitList(LinkList *&L)
{
L = (LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
/* 向单链表中插入数据元素 */
bool ListInsert(LinkList *&L,int x,char e)
{
int j = 0;
LinkList *p = L, *s;
while(p!=NULL && j<x-1)
{
p = p->next;
j++;
}
if(p==NULL)
{
return false;
}
else
{
s = (LinkList *)malloc(sizeof(LinkList));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
/* 输出单链表 */
void DispList(LinkList *L)
{
LinkList *p = L->next;
while(p!=NULL)
{
printf("%c",p->data);
p = p->next;
}
printf("\n");
}
/* 求单链表的长度 */
int ListLength(LinkList *L)
{
LinkList *p = L->next;
int i = 0;
while(p!=NULL)
{
i++;
p = p->next;
}
return i;
}
/* 查看单链表是否为空 */
bool ListEmpty(LinkList *L)
{
return L->next==NULL;
}
/* 求单链表中某个数据元素值 */
bool GetElem(LinkList *L,int i, ElemType &e)
{
LinkList *p = L;
int j = 0;
while(p!=NULL && j < i)
{
p=p->next;
j++;
}
if(p==NULL)
{
return false;
}
else
{
e = p->data;
return true;
}
}
/* 在单链表中查找元素 */
int LocateElem(LinkList *L,ElemType e)
{
LinkList *p = L;
int i = 0;
while(p!=NULL && p->data!=e)
{
p = p->next;
i++;
}
if(p==NULL)
{
return 0;
}
else
{
return i;
}
}
/* 删除单链表中第 i 个元素*/
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j = 0;
LinkList *p = L, *q;
while(p!=NULL && j < i - 1)
{
p = p->next;
j++;
}
if(p==NULL)
return false;
else
{
q = p->next;
if(q==NULL)
return false;
e = q->data;
p->next = q->next;
free(q);
return true;
}
}
/* 删除单链表 */
void DestroyList(LinkList *&L)
{
LinkList *p = L;
LinkList *q = p->next;
while(q!=NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
int main( )
{
LinkList *h;
ElemType e;
printf("单链表的基本运算如下:\n");
printf("(1)初始化单链表\n");
InitList(h);
printf("(2)依次采用尾插法插入 a,b,c,d,e 元素\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf("(3)输出单链表:");
DispList(h);
printf("(4)单链表h的长度 = %d\n",ListLength(h));
printf("(5)单链表h为%s\n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
printf("(6)单链表h的第3个元素 = %c\n",e);
printf("(7)元素a的位置 = %d\n",LocateElem(h,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
ListInsert(h,4,'f');
printf("(9)输出单链表h:");
DispList(h);
printf("(10)删除h的第3个元素\n");
ListDelete(h,3,e);
printf("(11)输出单链表h:");
DispList(h);
printf("(12)释放单链表h\n");
DestroyList(h);
return 0;
}