#include
#include
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Slink;
//创建单链表结构体
void InitList(Slink *&h)
{
h=(Slink*)malloc(sizeof(Slink));
h->next=NULL;
}
//初始化单链表
void Destroy(Slink *&h)
{
Slink *pre=h,*p=pre->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
//销毁单链表
bool listEmpty(Slink *h)
{
return (h->next==NULL);
}
int ListLength(Slink *h)
{
int n=0;
Slink *p=h->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return n;
}
//判断单链表是否为空
//true or false
//空 or 非空
void DispList(Slink *h)
{
Slink *p=h->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
//打印单链表
int getElem(Slink *h,int i,ElemType *e)
{
int j=0;
Slink *p=h;
if(i<0)
return false;
while(jnext;
}
if(p==NULL)
return false;
else
{
*e=p->data;
return j;
}
}
//获取指定位置元素
int LocateElem(Slink *h,ElemType e)
{
int i=1;
Slink *p=h->next;
while(e!=p->data&&p!=NULL)
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
//获取指定元素位置
int CreatList(Slink *&h,ElemType a[],int n)
{
Slink *s,*tc;
InitList(h);
tc=h;
for(int i=0;idata=a[i];
tc->next=s;
tc=s;
}
tc->next=NULL;
}
//运用尾插法建表
bool ListInsert(Slink *h,int i,ElemType e)
{
int j=0;
Slink *p=h,*s;
if(i<0)
return false;
while(jnext;
j++;
}
if(p==NULL)
return false;
else
{
s=(Slink*)malloc(sizeof(Slink));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
//在指定位置插入指定元素
bool ListDelete(Slink *&h,int i,ElemType e)
{
int j=0;
Slink *p=h,*q;
if(i<0)
return false;
while(jnext;
}
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;
}
}
//删除指定位置元素
int main()
{
ElemType e,a[5],Pos,obj,InsertElem,InsertPos,DeletePos,DeleteElem;
printf("请输入数组元素:\n");
for(int i=0;i<5;i++)
{
scanf("%d",a+i);
}
Slink *h;
InitList(h);
printf("依次采用尾插法插入元素\n");
CreatList(h,a,5);
printf("输出单链表:\n");
DispList(h);
printf("单链表的长度:length=%d\n",ListLength(h));
printf("判断单链表是否为空?%s\n",(listEmpty(h)?"空":"非空"));
printf("请输入想要获取元素的位置:");
scanf("%d",&Pos);
getElem(h,Pos,&e);
printf("在%d位置上的元素是:%d\n",Pos,e);
printf("请输入要查找位置的元素:\n");
scanf("%d",&obj);
printf("%d在单链表中的位置是:%d\n",obj,LocateElem(h,obj));
printf("请输入要插入的元素和位置:\n");
scanf("%d %d",&InsertElem,&InsertPos);
ListInsert(h,InsertPos,InsertElem);
printf("请输入操作后的单链表:\n");
DispList(h);
printf("请输入要删除元素的位置:");
scanf("%d",&DeletePos);
ListDelete(h,DeletePos,e);
printf("输出再次操作的单链表:\n");
DispList(h);
printf("销毁单链表\n");
Destroy(h);
return 0;
}
//主函数
运行结果如下:
优化后