- /*
- 烟台大学计算机学院
- 文件名称: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);//元素删除
- 运行结果: