实验一 线性表的有关操作

实验一  线性表的有关操作

一、实验学时:2学时

二、背景知识:单链表的插入、删除及应用。

三、目的要求:

1、掌握单向链表的存储特点及其实现。

2、理解和掌握单链表的类型定义方法和结点生成方法。

3、掌握单向链表的插入、删除算法及其应用算法的程序实现。

四、实验内容:

1、随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。

2、遍历单向链表(显示)。

3、把单向链表中元素逆置(不允许申请新的结点空间)。

4、在单向链表中删除所有的偶数元素(值为偶数)结点。

5、编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。

6、利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。

7、利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。

8、编写一个主函数,调试上述算法。

五、实验说明:

1、类型定义

typedefint  ElemType;//元素类型

typedef  struct node

{ElemTypedata

structnode *next

}LNode,*LinkList

2、为了算法实现简单,最好采用带头结点的单向链表。

六、注意问题:

1、重点理解链式存储的特点及指针的含义。

2、注意比较顺序存储与链式存储的各自特点。

3、注意比较带头结点、无头结点链表实现插入、删除算法时的区别。

4 、单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
  typedef struct node
  {
      int data;
      struct node *next;
  } LNode,*LinkList;
   void  init(LinkList &L)
  {
      L=(LinkList)malloc(sizeof(LNode));
      L->next=NULL;
  }
 void createlist(LinkList &L,int n)
 {
     LinkList p;
     L=(LinkList)malloc(sizeof(LNode));
     L->next=NULL;
     for(int i=0;i<n;i++)
     { p=(LinkList)malloc(sizeof(LNode));
        cin>>p->data;
        p->next=L->next;L->next=p;
     }
 }
 void outputlist(LinkList &L)
 {  LinkList p;
    p=L->next;
     while(p)
    {
        printf("%d  ",p->data);
        p=p->next;
    }
    printf("\n");
  printf("        显示完成!!!!!!\n");
 }
//void converse(LinkList head)
//{
//    LinkList p,q;
//    p=head->next;
//    head->next=NULL;
//    while(p)
//    {
//        /*向后挪动一个位置*/
//        q=p;
//        p=p->next;
//
//        /*头插*/
//        q->next=head->next;
//        head->next=q;
//    }
//}
void Reverse(LinkList &L)
{
    LinkList last = L->next;
    LinkList first;
    while(last->next)
    {
        first = L->next;
        L->next = last->next;
        last->next = L->next->next;
        L->next->next = first;
    }
}
void shanou(LinkList head)
{
LinkList p,q;
q=head;
p=head->next;
while(p)
{
if((p->data%2!=0))

{
 p=p->next;
q=q->next;
}
else
{q->next=p->next;
p=p->next;

}
}
printf("shanou后的链式表为:\n");

p=head->next;
while(p)
{printf("%3d",p->data);

p=p->next;

}
printf("\n");
}
void Srot(LinkList L) //对数据非递减排序

{
    LinkList p,q,T;
    ElemType m;
    int chan=-1;
    p = L->next;
    for(;p!=NULL;p=p->next)
    {
        T = p;
        for(q=p->next;q!=NULL;q=q->next)
        {
            if((q->data)<(T->data))
             T = q;
        }
        m = T->data;
        T->data = p->data;
        p->data = m;
    }
   printf("排序完成!\n"); }
void ListInsert(LinkList &L1,ElemType e)  //插入数据;
{  //  init(L);
    LinkList p,q,T;
    //int chan = -1;
    //Srot(L);
    T=(LinkList)malloc(sizeof(LNode)); //创建插入的结点;

    T->data = e;
    p = L1;
    q = p->next;
    while(q)
    {
//        if(q->data>e||q->data==e)
//            break;
//        p = p->next;
//        q = q->next;
    q=q->next;
    }
    q->next=T;
    T->next=NULL;
    Srot(L1);
   // T->next = q;
   // p->next = T;
//    printf("插入完成!\n");
//    printf("按“1”输出:");
//  scanf("%d",&chan);
//   if(chan)
//    outputlist(L);
}
//void insert_sert(LinkList &L,int i)
//{
//    LinkList s;
//    s=(LinkList)malloc(sizeof(LNode));
//    s->data=i;
//    static int n=0;
//    int m=0;
//    LinkList p,q;
//    p=L;
////    cout<<n<<endl;
////    Sleep(1000);
//    if(n==0)
//    {
//        s->next=NULL;
//        L->next=s;
//        n++;
//    }
//   else
//    {
//    while(p->next!=NULL)
//    {
//        q=p->next;
//        if(s->data<q->data)
//        {
//            s->next=q;
//            p->next=s;
//            m=1;
//            break;
//        }
//        p=p->next;
//    }
//    if(m==0)
//    {
//    //s->next=NULL;
//    p->next=s;
//    }
//    }
//
//}
void DecreasePro_L(LinkList &La,LinkList &Lb)
{
    LinkList pa,pb,pc,Lc;
     Reverse(La);
    Reverse(Lb);
     Lc = pc = La;
    pa = La->next;
    pb = Lb->next;
    while(pa&&pb)
    {
        if((pa->data)>(pb->data)||(pa->data)==(pb->data))
        {   pc->next = pa;
            pc = pa;
            pa = pa->next;
        }else{
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
       if(pa==NULL)
        {
            pc->next = pb;
        }
        if(pb==NULL)
        {
            pc->next = pa;
        }
     La = Lc;
     free(Lb);
     printf("非递增归并完成!\n");
}
void surface(){
    int i;
    printf("              ");
    for(i=1;i<=47;i++)
    printf("%c",4);
    printf("\n");
    printf("              |%c%c%c%c           线性表的有关操作         %c%c%c%c|\n",3,4,5,6,3,4,5,6);
    printf("              |%c 1.输入数据产生无序链表   6.合成递增链表     %c|\n",5,5);
    printf("              |%c 2.插入元素产生递增链表   7.遍历单向链表(显示) %c|\n",5,5);
    printf("              |%c 3.单向链表中元素就地逆置   8. %c|\n",5,5);
    printf("              |%c 4.单向链表中删除所有的偶数元素   9.       %c|\n",5,5);
    printf("              |%c 5.合成递减链表   10.运行结束              %c|\n",5,5);
    printf("              ");
    for(i=1;i<=47;i++)
    printf("%c",4);
    printf("\n");
    printf("                                                                 ------王祥\n");
}
int main()
{
int num;
   LinkList L1;
while(1){
      surface();
      int i;
      printf("请输入1——10中某个数字实现其对应功能:\n");
      for(i=1;i<=37;i++)
      printf("%c",4);
      printf("\n");
      cin>>num;
      if(num==10){
      printf("%c%c%c感谢您的使用!%c%c%c\n",1,1,1,1,1,1);
      for(i=1;i<=37;i++)
      printf("%c",4);
      printf("\n");
      break;
      }
      if(num<=0||num>10){
      printf("x_x请按正确格式输入x_x\n");
      for(i=1;i<=37;i++)
      printf("%c",4);
      printf("\n");
      continue;
      }
     if(num==1){
     printf("请输入链表长度\n");
      int n;
     cin>>n;
  createlist(L1,n);
     }
     if(num==7){
     outputlist(L1);
     }
    if(num==2){
     cout<<"请输入数据个数"<<endl;
                    int i,j,a;
                    cin>>i;
                      createlist(L1,i);
                      Srot(L1);

    }
  if(num==3){
  Reverse(L1);
  outputlist(L1);
  cout<<"就地逆置完成"<<endl;
  }
 if(num==4){
 shanou(L1);
   cout<<"删偶完成!!!"<<endl;
 }
 if(num==6){
  LinkList L2;
  int q,w;
  printf("请输入第一个链表的长度\n");
  scanf("%d",&q);
  createlist(L1,q);
  printf("请输入第二个链表的长度\n");
   scanf("%d",&w);
   createlist(L2,w);
   DecreasePro_L(L1,L2);
   Srot(L1);
    outputlist(L1);
 }
 if(num==5){
  LinkList L2;
  int q,w;
  printf("请输入第一个链表的长度\n");
  scanf("%d",&q);
  createlist(L1,q);
  printf("请输入第二个链表的长度\n");
   scanf("%d",&w);
   createlist(L2,w);
   DecreasePro_L(L1,L2);
   Srot(L1);
   Reverse(L1);
    outputlist(L1);
 }
}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37997523/article/details/80038871