第四周---2

问题及描述:


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


   运行结果:
  
       


学习心得:


   通过这次的训练,学会了建立链表算法库,感觉好开心
    
    
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值