问题及描述:
/*
烟台大学计算机学院
文件名称:xm.cpp
作者:范宝磊
完成日期:2017年9月24日
问题描述:建立单链表算法库
输入描述:无
输出描述:进行了各个的链表的值
*/
list.cpp
#include <stdio.h>
#include <malloc.h>
#include "list.h"
void initList(Linklist *&L)//初始化链表
{
L=(Linklist *)malloc(sizeof(Linklist));//动态开辟内存
L->next=NULL;//链表为空
}
bool ListInsert(Linklist *&L,int i,ElemType e)//链表插入
{
int j=0;
Linklist *p=L,*s;
if(i<=0)//输入的i比0小不合法
{
return false;
}
while(j<i-1 && p!=NULL)//遍历
{
j++;
p=p->next;
}
if(p==NULL)//未找到i-1位置结点
{
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("%d ",p->data);
p=p->next;
}
printf("\n");
}
void DestroyList(Linklist *&L)//销毁链表
{
Linklist *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void CreateListF(Linklist *&L,ElemType a[],int n)
{
Linklist *s;
L=(Linklist *)malloc(sizeof(Linklist));//动态开辟内存空间
L->next=NULL;
for(int i=0;i<n;i++)//头插法
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void CreateListR(Linklist *&L,ElemType a[],int n)//尾插法
{
Linklist *s,*r;
L=(Linklist *)malloc(sizeof(Linklist));
r=L;
for(int i=0;i<n;i++)//尾插法
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
bool ListDelete(Linklist *&L,int i,ElemType &e)//删除链表元素
{
int j=0;
Linklist *p=L,*q;
if(i<=0)return false;
while(j<i-1 && p!=NULL)//找到i的前一节点i-1
{
j++;
p=p->next;
}
if(p==NULL)//p为空,未找到元素
{
return false;
}
else
{
q=p->next;
if(q==NULL)//未找到元素
{
return false;
}
e=q->data;//删除的元素保留到e
p->next=q->next;
free(q);
return true;
}
}
main函数:
#include <stdio.h>
#include <malloc.h>
#include "list.h"
int main()
{
Linklist *L1,*L2;
ElemType a[8]={7,9,8,2,0,4,6,3};
printf("头插法建表结果:");
CreateListF(L1,a,8);
DispList(L1);
printf("尾插法建表结果:");
CreateListR(L2,a,8);
DispList(L2);
DestoryList(L1);
DestoryList(L2);
int b;
Linklist *L3;
CreateListR(L3,a,8);
ListDelete(L3,4,b);
printf("删除a数组中的元素:");
printf("%d\n",b);
DispList(L3);
printf("插入验证:");
Linklist*L;
initList(L);
ListInsert(L,1,15);
ListInsert(L,1,10);
ListInsert(L,1,5);
ListInsert(L,1,20);
DispList(L);
DestroyList(L);
return 0;
}
list.h :
#include <stdio.h> #include <malloc.h> #include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }Linklist; void initList(Linklist *&L);//初始化链表 bool ListInsert(Linklist *&L,int i,ElemType e);//链表插入 void DispList(Linklist *L);//输出 void DestroyList(Linklist *&L);//销毁 void CreateListF(Linklist *&L,ElemType a[],int n);//头插法 void CreateListR(Linklist *&L,ElemType a[],int n);//尾插法 bool ListDelete(Linklist *&L,int i,ElemType &e);//元素删除
运行结果:
学习心得:
通过这次的训练,学会了建立链表算法库,感觉好开心