#include<stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType date;
LNode * next;
} Node , *LinkList;
//初始化单链表
Status InitList(LinkList &L)
{
int i,n;
Node* p=NULL;
Node* q=NULL;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
p=L;
printf("\n请输入要输入的数据个数:n \n");
scanf("%d",&n);
while(n<0)
{
printf("\n输入有误,请从新输入:\n");
scanf("%d",&n);
}
if(n==0)
{
return OK;
}
//尾插法初始化
for(i=1;i<=n;++i)
{
q=(Node*)malloc(sizeof(Node));
if(!p)
{
printf("\n内存分配失败!\n");
exit(OVERFLOW);
}
printf("\n请输入数据:\n");
scanf("%d",&q->date);
q->next=p->next;
p->next=q;
p=q;
}
//头插法初始化
/*for(i=1;i<=n;++i)
{
q=(Node*)malloc(sizeof(Node));
if(!p)
{
printf("\n内存分配失败!\n");
exit(OVERFLOW);
}
printf("\n请输入数据:\n");
scanf("%d",&q->date);
q->next=p->next;
L->next=q;
}*/
return OK;
}
//打印单链表
Status PutOut(LinkList &L)
{
LinkList p=L;
if(!L->next)
{
printf("\n单链表为空!\n");
return OK;
}
printf("\n单链表元数为:\n");
while(p->next)
{
printf(" %d",p->next->date);
p=p->next;
}
printf("\n\n");
return OK;
}
//单链表长度
int ListLength(LinkList &L)
{
int i=0;
Node* p=NULL;
p=L->next;
while(p)
{
++i;
p=p->next;
}
return i;
}
//在第 i位置之前插入元数
Status ListInsert(LinkList &L,int i,ElemType &e)
{
int j=1;
Node* p=L->next;
Node* q=NULL;
if(i<1||i>ListLength(L))
{
printf("\ni 值不合法请从新输入:1~%d\n",ListLength(L));
return ERROR;
}
while(p&&(j<i-1))
{
j++;
p=p->next;
}
q=(Node*)malloc(sizeof(Node));
q->date=e;
if(i==1)
{
q->next=L->next;
L->next=q;
}
else
{
q->next=p->next;
p->next=q;
}
return OK;
}
//删除第 i个元素
Status ListDelete(LinkList &L,int i,ElemType &e)
{
int j=1;
Node* p=L->next;
Node* q=NULL;
if(i<1||i>ListLength(L))
{
printf("\ni 值不合法请从新输入:1~%d\n",ListLength(L));
return ERROR;
}
while(p&&(j<i-1))
{
j++;
p=p->next;
}
if(i==1)
{
q=L->next;
L->next=q->next;
e=q->date;
free(q);
}
else
{
q=p->next;
p->next=q->next;
e=q->date;
free(q);
q=NULL;
}
return OK;
}
//销毁链表
Status DestroyList(LinkList &L)
{
Node* p=L->next;
while(p)
{
L->next=p->next;
free(p);
p=L->next;
}
return OK;
}
//测试代码
int main()
{
int e2,e1=12;
LinkList L;
InitList(L);
/*ListInsert(L,1,e1);
printf("\n链表长度为:%d\n",ListLength(L));
PutOut(L);
ListDelete(L,1,e2);
printf("%d\n",e2);*/
DestroyList(L);
PutOut(L);
return 0;
}