第四周项目3--单链表应用(2)

问题及代码:

/*   
 *Copyright(c) 2015, 烟台大学计算机学院   
 *All rights reserved.   
 *文件名称:单链表应用(2).cpp   
 *作    者:杜文文  
 *完成日期:2015年 10月 11日   
   
 *问题描述:已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,
            请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。 
 *输入描述:此程序没有输入。  
 *程序输出:输出调整后的结果。  
*/      

linklist.h:

#ifndef LINKLIST_H_INCLUDED
 #define LINKLIST_H_INCLUDED

typedef int ElemType;
 typedef struct LNode        //定义单链表结点类型
{
     ElemType data;
     struct LNode *next;     //指向后继结点
}LinkList;
 void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void InitList(LinkList *&L);  //初始化线性表
void DestroyList(LinkList *&L);  //销毁线性表
bool ListEmpty(LinkList *L);  //判断线性表是否为空
int ListLength(LinkList *L);  //求线性表长度
void DispList(LinkList *L);  //输出线性表
bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值
int LocateElem(LinkList *L,ElemType e);  //按元素值查找
bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素
bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素

#endif // LINKLIST_H_INCLUDED

linklist.cpp:

#include <stdio.h>
 #include <malloc.h>
 #include "z.h"

void Link(LinkList *&L1, LinkList *&L2)
 {
     LinkList *p = L1;
     while(p->next != NULL)   //找到L1的尾节点
        p = p->next;
     p->next = L2->next;  //将L2的首个数据节点连接到L1的尾节点后
    free(L2);   //释放掉已经无用的L2的头节点
}

void DestroyList(LinkList *&L)
 {
     LinkList *p=L,*q=p->next;
     while (q!=NULL)
     {
         free(p);
         p=q;
         q=p->next;
     }
     free(p);    //此时q为NULL,p指向尾结点,释放它
}

void InitList(LinkList *&L)
 {
     L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点
    L->next=NULL;
 }

void DispList(LinkList *L)
 {
     LinkList *p=L->next;
     while (p!=NULL)
     {
         printf("%d ",p->data);
         p=p->next;
     }
     printf("\n");
 }

bool ListInsert(LinkList *&L,int i,ElemType e)
 {
     int j=0;
     LinkList *p=L,*s;
     while (j<i-1 && p!=NULL) //查找第i-1个结点
    {
         j++;
         p=p->next;
     }
     if (p==NULL)    //未找到位序为i-1的结点
        return false;
     else            //找到位序为i-1的结点*p
     {
         s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s
         s->data=e;
         s->next=p->next;                        //将*s插入到*p之后
        p->next=s;
         return true;
     }
 }

main.cpp:

int main()
 {
     LinkList *A, *B;
     int i;
     ElemType a[]= {1,3,2,9};
     ElemType b[]= {0,4,7,6,5,8};
     InitList(A);
     for(i=3; i>=0; i--)
         ListInsert(A, 1, a[i]);
     InitList(B);
     for(i=5; i>=0; i--)
         ListInsert(B, 1, b[i]);
     Link(A, B);
     printf("A:");
     DispList(A);
     DestroyList(A);
     return 0;
 }


运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值