/**
* 单链表
**/
#include <stdlib.h>
#include <iostream.h>
#define OK 1
#define ERROR 0
//结点类型
typedef struct node{
int item;
struct node *next;
}NODE;
//链表类型
typedef struct{
NODE *head;
}LINK_LIST;
//初始化单链表
int init(LINK_LIST *L)
{
L->head=(NODE*)malloc(sizeof(NODE));
//为头结点分配存储单元
if (L->head)
{
L->head->next=NULL;
return OK;
}
else
return ERROR;
}
//销毁链表L
void destory(LINK_LIST *L)
{
NODE *p;
while (L->head){ //依次删除链表中的所有结点
p=L->head;
L->head=L->head->next;
free(p);
}
}
//清空单链表
void clear(LINK_LIST *L)
{
NODE *p;
while (L->head->next){
p=L->head->next; //p指向链表中头结点后面的第一个结点
L->head->next=p->next; //删除p结点
free(p); //释放p结点占据的存储空间
}
}
//链表长度
int length(LINK_LIST L)
{
NODE *p = L.head;
int len;
for(p=L.head,len=0; p->next!=NULL; p=p->next,len++);
return(len);
}
//判断是否为空
int isEmpty(LINK_LIST L)
{
if(L.head->next==NULL)
return 1;
else
return 0;
}
//通过e返回链表L中第i个数据元素的内容
void getElem(LINK_LIST L,int i,int *e)
{
NODE *p;
int j;
if (i<1||i>length(L)) exit(0);
//检测i值的合理性
for (p=L.head,j=0; j!=i; p=p->next,j++);
//找到第i个结点
*e=p->item;
//将第i个结点的内容赋给e指针所指向的存储单元中
}
//在链表L中检索值为e的数据元素
NODE *locateELem(LINK_LIST L,int e)
{
NODE *p;
for(p=L.head->next;p&&p->item!=e;p=p->next);
//寻找满足条件的结点
return(p);
}
//返回链表L中结点e的直接前驱结点
NODE *PriorElem(LINK_LIST L,NODE *e)
{
NODE *p;
if (L.head->next==e) return NULL;
//检测第一个结点
for (p=L.head;p->next&&p->next!=e;p=p->next);
if (p->next==e) return p;
else return NULL;
}
//返回链表L中结点e的直接后继结点
NODE *NextElem(LINK_LIST L,NODE *e)
{
NODE *p;
for(p=L.head->next;p&&p!=e;p=p->next);
if (p) p=p->next;
return p;
}
//在链表L中第i个数据元素之前插入数据元素e
int insertList(LINK_LIST *L,int i,int e)
{
NODE *p,*s;
int j;
if (i<1||i>length(*L)+1) return ERROR;
s=(NODE*)malloc(sizeof(NODE));
if (s==NULL) return ERROR;
s->item=e;
for (p=L->head,j=0;p&&j<i-1;p=p->next,j++);
//寻找第i-1个结点
s->next=p->next; p->next=s; //将s结点插入
return OK;
}
//将链表L中第i个数据元素删除,并将其内容保存在e中。
int deleteList(LINK_LIST *L,int i,int *e)
{
NODE *p,*s;
int j;
if (i<1||i>length(*L)) return ERROR;
//检查i值的合理性
for(p=L->head,j=0;j<i-1;p=p->next,j++);
//寻找第i-1个结点
s=p->next; //用s指向将要删除的结点
*e=s->item;
p->next=s->next; //删除s指针所指向的结点
free(s);
return OK;
}
//插入链表
void insert(LINK_LIST *L)
{
cout<<"请依次递增输入这5个数据:"<<endl;
NODE *head = L->head;
for(int i=0;i<5;i++)
{
NODE* node = (NODE*)malloc(sizeof(NODE));
cin>>node->item;
node->next = NULL;
head->next = node;
head = node;
}
}
//输出单链表
void print(LINK_LIST L)
{
NODE* head = L.head->next;
while(head != NULL)
{
cout<<head->item<<" ";
head = head->next;
}
cout<<endl;
}