实验二 单链表实验

来源:互联网 发布:webuploader php 编辑:程序博客网 时间:2024/04/29 13:35

实验课程名:数据结构

专业班级: 11级计科专升本  学号:                     姓名:             

实验时间: 4.16           实验地点:   K4-207         指导教师:          

实验目的:

1、掌握实验用Visual C++6.0上机调试单链表的基本方法;

2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现;

3、进一步掌握循环单链表的插入、删除、查找算法的实现。

试验内容:

代码如下:

#include "stdafx.h"

#include<iostream.h>

#include<stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <iostream.h>

#include <conio.h>

#include <string.h>

 

#define LISTINCREMENT 10

#define LIST_INIT_SIZE 10

#define ERROR 0

#define OK 1

 

 

typedef int ElemType;

 

 

 

 

/*链式存储类型 */

typedef struct LNode

{    ElemType data;

             struct LNode *next;

}LNode,*LinkList;

 

//链表插入

int ListInsert(LinkList &L,int i,int e) //ListInsert_L() sub-function

{  LNode *p=L;

   int j=0;

   while(p&&j<i-1)                 //find the location

   {  p=p->next;

      ++j;

   }

   if(!p||j>i-1)             //out of location

   {  cout<<"Errer! The location is illegal!"<<endl;

      return (ERROR);

   }

   LNode *s;

   s=(LinkList)malloc(sizeof(LNode));      //create new LNode

   s->data=e;

   s->next=p->next;

   p->next=s;

   return (OK);

} //ListInsert_L() end

 

 

 

/*单链表的取元素*/

int GetElem_L(LinkList L,int i,int &e)            

{ 

  LNode *p;

  int j=1;

  p=L->next;

  while(p&&j<i)

  {p=p->next;++j;}

  if(!p||j>i)

  { cout<<"The NO. "<<i<<" element is not exist !"<<endl;

    getch();

    exit(0);

  }

  e=p->data;

  return (e);

}

 

 

//单链表的排序(选择)

int sort(LinkList &Lc )

{ 

      LNode *k,*j,*p=Lc->next;

      int t;

      for(;NULL!=p;p=p->next)

      {

             k=p;

             for(j=p->next;NULL!=j;j=j->next)

                    if((j->data)<(k->data))

                           k=j;

                    t=k->data;

                    k->data=p->data;

                    p->data=t;

      }

 

   return (OK);

}

 

 

 //单链表的合并

int Merger(LinkList &La,LinkList &Lb,LinkList &Lc) 

{       

  LNode *p=La->next,*q=Lb->next;

  while(NULL!=p->next)

  {

             p=p->next;  

  }

  p->next=q;

  Lc=La;

                    

         cout<<"Success to Merge B and C !"<<endl;

      

         return(1);

      }

 

 

 

/*单链表的建立(尾插法)*/

void CreateList_L(LinkList &L,int n)            

{ 

 int i;

 LNode *p,*q;

 L=(LinkList)malloc(sizeof(LNode));

 L->next=NULL;

 q=L;

 cout<<"请输入元素的值:";

 for(i=n;i>0;--i)

 {

        p=(LinkList)malloc(sizeof(LNode));

        cin>>p->data;                      

        p->next=q->next;

        q->next=p;

        q=p;

 }

 if(n) cout<<"Success to Create a LinkList !"<<endl;

 else cout<<"A NULL LinkList have been created !"<<endl;

}

 

 

 //输出链表

void output(LinkList La)

{

      LinkList p;

      p=La->next;

      while(p!=NULL)

      {

             cout<<p->data<<" ";

             p=p->next;

      }

      cout<<endl<<endl;

}           

 

             

 

 

 

 

 

int main(int argc, char* argv[])

{

      int a,b,i;

      LinkList La,Lb,Lc;

      cout<<"请输入链表La中的元素个数a并创建链表La:";

      cin>>a;

      CreateList_L(La,a);

      cout<<"输出链表La:";

   output(La);

      

      cout<<"请输入链表Lb中的元素个数b并创建链表Lb:";

      cin>>b;

      CreateList_L(Lb,b);

      cout<<"输出链表Lb:";

   output(Lb);

 

      cout<<"输出合并后的链表Lc:";

      Merger(La,Lb,Lc);

      sort(Lc);

             output(La);

      return 0;

}

任务一:已知单链表lalb中的数据元素按非递减有序排列,将lalb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。要求①不破坏la表和lb表的结构。②破坏la表和lb表的结构。且从键盘读取元素。

 

任务二:编程实现两个循环单链表的合并。

//循环链表的合并(思想是头尾先拆开然后合并最后在把头尾结合并且如果需要排序那就用Sort函数排序)

int Merger(LinkList &La,LinkList &Lb,LinkList &Lc) 

{       

  LNode *p=La->next,*q=Lb->next;

  while(La->next!=p->next)

  {

             p=p->next;  

  }

  p->next=q;

  while(Lb->next!=q->next)

  {

             q=q->next;  

  }

  q->next=La->next;

  Lc=La;

  cout<<"Success to Merge B and C !"<<endl;

         

            return(1);

         }

 

/*循环链表的输出*/

void output(LinkList La)

{

         LinkList p;

         p=La->next;

         int i=0;             

         while((p!=La->next) || i==0)

         {

             cout<<p->data<<" ";

             p=p->next;

             i++;

         }

         

         cout<<endl<<endl;

}

任务三:将一循环单链表就地逆置

//循环链表的逆置

void wart(LinkList &La)

{

      LinkList p,q,rear;

      int i=0;                        

      q=p=La->next;

      while(La != q->next)

      {

             while(p->next->next != La)

             {

             p=p->next;

             }

             if(i==0)                        //i用来保护尾指针砸在每一次的循环中被修改

             {

                    rear=p->next;

             }

             i++;

             p->next->next=p;

             p->next=La;

      }

      La->next=rear;

}

 //输出链表

void output(LinkList La)

{

      LinkList p;

      p=La->next;

      //int i=0;

      while((p!=La))

      {

      

             cout<<p->data<<" ";

             p=p->next;

      //     i++;

      }

      

      cout<<endl<<endl;

}    

实验总结:通过本实验使我了解了链表的基本建立和链表的使用,已经初步建立一些链表之类的删除,和动态管理一些链表的空间,对链表的初步使用。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丝母欲韵txt全文下载80 经典家庭伦txt丝母韵欲光棍 李阳阳 白爽 丝母 我的丝母欲韵盘多多 娇母 笔趣阁 校长妈陈淑娴外篇 丝母欲韵500 我的丝母欲韵13 经典家庭伦txt丝母韵欲电子书 经典家庭伦txt丝母韵欲彩图 经典家庭伦txt丝母韵欲txt下载 经典家庭伦txt丝母韵欲d下载 经典家庭伦txt丝母韵欲视频 长篇都市情感小说 经典家庭伦全文 久九九久精品免费视频 91在线中文字幕香蕉人人视频 经典家庭伦txt岳丝母小丹韵欲阅读 碰超上线视频人人视频千人 91青青碰起上线视频人人 车里太挤姑妈坐我腿上做小说 经典家庭伦txt岳丝母小丹韵欲小说 我的丝母欲韵第六节 91在线中文久人人视频动漫 悉母全集动漫完整视频 类别中文动漫中的视频 腐母动漫全集视频时长 86 母汁视频动漫 久99久视频精品免费观看38 难以忍耐动漫视频中文 久九九久手机视频 乳娘家教动漫无删减在线播放 久99久精品视频只有精品 母恋人2017中文 久九九久视频精品6思思 巨母3动漫在线 久99久视频精品免费视频动漫 水柔姐大战儿子视频91 久九九久视频精品 99视频国内99视频在线观 横恋人母日语中字