数据结构51道基础题之线性表13题

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 数据结构51道基础题之线性表13题


目录

前言

一、线性表基础13题

1.线性表的建立

2.单链表的建立-前插法

3.单链表的建立-后插法

4.顺序表的插入

5.顺序表的查找—按序号进行查找

6.顺序表的查找—按值进行查找

7.单链表的插入

8.顺序表删除_新

9.单链表的查找-按序号查找_新

10.单链表结点的删除_ 新

11.线性表的合并_新

12.有序表的合并_新

13.有序链表的合并_新

总结


一、线性表基础13题

1.线性表的建立

1、定义顺序表存储结构

2、初始化顺序表为空(InitList_Sq)

3、输入顺序表数据(CreateList_Sq)

4、遍历(输出)顺序表数据(TraverseList_Sq)

5、销毁顺序表数据(DestroyList_Sq)

例如:

输入元素个数和数据如下:

5

5  3  8  7  9

程序输出为:

5,3,8,7,9

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct
{
    int *elem;
    int length;
}SqList;
SqList InitList_Sq(SqList L)
{
   L.elem=(int *) malloc(100* sizeof(int));
   L.length=0;
   return L;
}
SqList CreateList_Sq(SqList L)
{
    int a;
    scanf("%d",&a);
    for(int i=0;i<a;i++)
    {
        int b;
        scanf("%d",&b);
        L.elem[i]=b;
        L.length++;
    }
    return L;
}
SqList TraverseList_Sq(SqList L)
{
    for(int i=0;i<L.length;i++)
    {
        if(i<L.length-1)
        {
            printf("%d,",L.elem[i]);
        }
        else
        {
            printf("%d",L.elem[i]);
        }
    }
}
SqList DestroyList_Sq(SqList L)
{
    L.length=0;
    free(L.elem);
    return L;
}
int main()
{
    SqList L;
    L=InitList_Sq(L);
    L=CreateList_Sq(L);
    TraverseList_Sq(L);
    L=DestroyList_Sq(L);
    return 0;
}

2.单链表的建立-前插法

1、定义单链表存储结构

2、初始化一个空的单链表L(InitList_L)

3、用前插法创建单链表数据(CreateList_F)

4、遍历(输出)单链表表数据(TraverseList_L)

5、销毁单链表表数据(DestroyList_L)

例如:

输入单链表结点个数和数据如下:

5

9 7 8 3 5

程序输出为:

5,3,8,7,9

# include <stdio.h>
# include <stdlib.h>
typedef struct Lnode{
    int data;
    struct Lnode *next;
}Lnode;
void InitList_L(Lnode * L)
{
//  Lnode *p;
    //   L =(Lnode *) malloc (sizeof(Lnode)) ;
       L->next=NULL;
} 
    int CreateList_F(Lnode * L,int n)
{
    Lnode * p ;
   p=L;
    for(int i=0;i<n;i++)
  { 
  Lnode * s=(Lnode *) malloc (sizeof(Lnode));
   scanf("%d", & (s->data));
        s -> next = p -> next;
    p -> next = s ;
     }   
}
     int  TraverseList_L (Lnode*L,int n)
     {
         Lnode *p;
         Lnode *q;
         q=L;
         p=q->next;
         while(p!=NULL)
         {
          if(p->next!=NULL)
             printf("%d,",p->data);
             if(p->next==NULL)
             {
              printf("%d",p->data);
       }
             p=p->next;
         }
     }
            int DestroyList_L(Lnode *  L)
{
    Lnode * p;
    p=L->next;
    Lnode * q;
      while(p!=NULL)
{
    q=p;
    free (q);
    p=p->next;
}
}
int main(void)
{
    int n;
    scanf("%d",&n);
          Lnode*L;
          InitList_L(L);
          CreateList_F (L,n);
          TraverseList_L(L,n);
          DestroyList_L(L);
          return 0;
}

3.单链表的建立-后插法

1、定义单链表存储结构

2、初始化一个空的单链表L(InitList_L)

3、用后插法创建单链表数据(CreateList_L)

4、遍历单链表表数据(TraverseList_L)

5、销毁单链表表数据(DestroyList_L)例如:

输入元素个数和数据如下:

5

5 3 8 7 9

程序输出为:

5,3,8,7,9

#include <stdio.h>
# include <stdlib.h>
#define  MAXSIZE 100  
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode {
  ElemType data; //结点的数据域
  struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void InitList_L(LinkList L) 
{ 
  L->next = NULL; 
}
Status CreateList_L(LinkList L,int n)
{
    LinkList p;
    L->next=NULL;
    p=L;
    for(int i=0;i<n;i++)
    {
       LinkList s =(LinkList)malloc(sizeof(LNode));
        scanf("%d",&s->data);
        s->next=NULL;
       p->next=s;
       p=s;
    }
}
void TraverseList_L(LinkList L,int n) 
//依次输出单链表里的每个元素
{ int i = 0;
  LNode *p;
  p = L->next;
  while (p)
  {
        if(p->next!=NULL)
             printf("%d,",p->data);
             if(p->next==NULL)
             {
              printf("%d",p->data);
       }
             p=p->next;
  }
} 
Status DestroyList_L(LinkList  L)
{
    LinkList p ;
    LinkList q;
    p=L->next;  
       while(p)
        {
            q=p;
           p=p->next;
        free (q) ;  
        }
 }
int main()
{
  LinkList  L;             
  int n;
  InitList_L(L);
scanf("%d",&n);
CreateList_L(L,n);
  TraverseList_L(L,n);
  DestroyList_L(L);
  return 0;
}

4.顺序表的插入

1、定义插入函数(ListInsert_Sq)

2、在主函数中遍历输出插入前线性表中的元素

3、在主函数中输入插入元素的位置和数据信息

4、显示插入后的顺序表数据信息(TraverseList_Sq)

例如:

输入元素个数和数据如下:

5

5  3  8  7  9

插入元素的位置和值为:

2

6

程序输出为:

5,3,8,7,9                  //在输入插入位置和值之前遍历输出的线性表中的数据元素

5,6,3,8,7,9

#include <stdio.h>
#include<stdlib.h>
#define  MAXSIZE 100  
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef  struct {
      ElemType  *elem;                                   //指向数据元素的基地址
      int  length;                                              //线性表的当前长度                                                   
 }SqList;
Status InitList_Sq(SqList *L)
{      //构造一个空的顺序表L
      L->elem=(ElemType*)malloc(sizeof(MAXSIZE));      //为顺序表分配空间
      if(!L->elem) exit(OVERFLOW);               //存储分配失败
      L->length=0;                                       //空表长度为0
      return OK;
}
void CreateList_Sq(SqList *L,int n)
{
  if(n<0||n>MAXSIZE){
      return ;
  }
  for(int i=0;i<n;i++){
      scanf("%d",&L->elem[i]);
      L->length++;
  }
}
//在此处定义顺序表插入函数ListInsert_Sq
void ListInsert_Sq(SqList *L,int m,int e){
    if(m<1||m>=L->length){
        return ;
    }
    for(int j=L->length;j>=m-1;j--){
        L->elem[j+1]=L->elem[j];
    }
    ++L->length;
    L->elem[m-1]=e;
}
void TraverseList_Sq(SqList *L)
{
    for(int i=0;i<L->length;i++){
        printf("%d",L->elem[i]);
        if(i!=L->length-1)
        {
            printf(",");
        }
    }
}
void DestroyList_Sq(SqList *L)
{
   free(L);    //释放存储空间
}
int main()
{
  SqList L;                            
  int i,n,e;
  InitList_Sq(&L);
        //提示:输入元素个数:
  scanf("%d",&n);
  CreateList_Sq(&L,n);
  TraverseList_Sq(&L);          //遍历输出插入前线性表数据元素
  //提示:在顺序表中输入新元素插入的位置和数据:
    int m;
    scanf("%d %d",&m,&e);
        //在此处编写 ListInsert_Sq函数的调用语句
    ListInsert_Sq(&L,m,e);
    printf("\n");
  TraverseList_Sq(&L);
          //  DestroyList_Sq(&L);
  return 0;
}

5.顺序表的查找—按序号进行查找

1、定义按序查找函数(GetElem_Sq)

2、在主函数中遍历输出查找之前线性表中的元素

2、在主函数中输入待查元素在顺序表中的位序

3、显示查找后的数据

例如: 输入顺序表元素个数和数据如下:

5

5  3  8  7  9

输入查找元素的位序为:

2

程序输出结果为:

5,3,8,7,9 //在调用查找函数之前遍历输出的线性表中的数据元素

3        //输出的待查元素的位序

#include <stdio.h>
#include<stdlib.h>
#define  MAXSIZE 100  
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef  struct {
  ElemType  *elem;     //指向数据元素的基地址
  int  length;                  //线性表的当前长度                                                     
 }SqList;
Status InitList_Sq(SqList *L)
{   
     L->elem=(int*) malloc (4*100);    //为顺序表分配空间
     if(! L-> elem) exit(OVERFLOW);           //存储分配失败
    L-> length=0;                                //空表长度为0
    return OK;
}
Status CreateList_Sq(SqList *L,int n)
{
for(int i=0;i<n;i++)
{
    scanf("%d",&L->elem[i]);
}
}
void TraverseList_Sq(SqList *L,int n)
{
  for(int k=0;k<n;k++){
        if(k==0){
            printf("%d",L->elem[k]);
        }
        if(k!=0){
        printf(",%d",L->elem[k]);
        }
    }
}
Status GetElem_Sq(SqList *L,int n)
{
    for(int i=0;i<n;i++)
    {
        if(i=n-1)
   printf("%d",L->elem[i]);
    }
}
void DestroyList_Sq(SqList *L)
{
    if(L->elem)
    free(L->elem);
}
int main()
{
  SqList L;             
  int i,n;
  ElemType e;
  InitList_Sq(&L);
  //提示:请输入元素个数:
scanf("%d",&n);
  CreateList_Sq(&L,n);
  TraverseList_Sq(&L,n);
  //提示:请输入想要获取的元素位序:";
printf("\n");
scanf("%d",&i);
  //在此处调用按序查找函数GetElem_Sq
GetElem_Sq(&L,i);
DestroyList_Sq(&L);
  return 0;
}

6.顺序表的查找—按值进行查找

1、定义按值查找函数(LocateELem_Sq)

2、在主函数中遍历输出查找前线性表中的元素

3、在主函数中输入待查元素

4、显示待查找元素的位置

例如: 输入顺序表元素个数和数据如下:

5

5  3  8  7  9

输入的待查找元素为:

3

程序输出结果有:

5,3,8,7,9  //在查找之前遍历输出线性表中的数据元素

2          //待查元素在线性表中的位置

#include <stdio.h>
#include<stdlib.h>
#define  MAXSIZE 100  
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef  struct {
  ElemType  *elem;     //指向数据元素的基地址
  int  length;              //线性表的当前长度                                                     
 }SqList;
Status InitList_Sq(SqList *L)
{    
       L-> elem=(int *) malloc (4*100);  //为顺序表分配空间
    if(! L-> elem) exit(OVERFLOW);           //存储分配失败
    L-> length=0;                   //空表长度为0
      return OK;
}
Status CreateList_Sq(SqList *L,int n)
{
for(int i=0;i<n;i++)
{
 scanf("%d",&L->elem[i]);   
}
}
void TraverseList_Sq(SqList *L,int n)
{
  for(int i=0;i<n;i++)
  {
      if(i==n-1)
      printf("%d",L->elem[i]);
      if(i!=n-1)
      printf("%d,",L->elem[i]);
  }
}
//在此处定义按值查找函数 LocateELem_Sq
Status LocateELem_Sq(SqList * L,int n, int e)
{
//  printf("hell");
    for(int i=0 ;i<n;i++)
        {
           if(L->elem[i]==e)
            {
                  printf("\n");
                  printf("%d",i+1);
            }
        }
}
void DestroyList_Sq(SqList *L)
{
       if (L->elem)
       free (L->elem);             //释放存储空间
}
     int main()
{
  SqList L;        
  int i,n;
  ElemType e;
  InitList_Sq(&L);
  //提示:请输入元素个数:
        scanf("%d",&n);
  CreateList_Sq(&L,n);
  TraverseList_Sq(&L,n);
  //提示:请输入要查找的元素:
     scanf("%d",&e);
    i=LocateELem_Sq(&L,n,e);//在此处调用按值查找函数LocateELem_Sq
  //提示:待查找元素e的位置为:
             DestroyList_Sq(&L);
             return 0;
}

7.单链表的插入

1、定义插入函数(ListInsert_L)

2、在主函数中输出插入新结点之前单链表中的结点信息(TraverseList_L)

3、在主函数中输入插入结点的位置和数据信息

4、显示插入后的单链表数据信息(TraverseList_L)

例如:

输入单链表结点个数和数据如下:

5

5  3  8  7  9

结点插入的位置和值为:

2

6

程序输出为:

5,3,8,7,9     // 插入新结点之前输出的单链表中的结点信息

5,6,3,8,7,9  //插入新结点之后输出的单链表中的结点信息

# include <stdio.h>
# include <stdlib.h>
typedef int Status;
typedef int ElemType;
typedef struct LNode {
  ElemType data; //结点的数据域
  struct LNode * next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
LinkList InitList_L(LinkList L) 
{ 
    L = (LinkList)malloc(sizeof(LNode));
  //构造一个空的单链表L
//  L = new LNode;                //生成新结点作为头结点,用头指针L指向头结点
  L->next = NULL;               //头结点的指针域置空
  return L;
}
void CreateList_L(LinkList L,int n)
{ 
       LinkList p,q;
       //L=(LinkList)malloc(sizeof(LNode));
       L->next=NULL;
       p=L;
   for(int i=0;i<n;i++)
    {
      q=(LinkList)malloc(sizeof(LNode));
    scanf("%d",&q->data);
      //printf("jjj");
      q->next=NULL;
      p->next=q;
      p=q;
}
  }
//在此处定义单链表的插入函数ListInsert_L
Status ListInsert_L(LinkList L,int x,ElemType i)
{
  LinkList p;
  p=L;
 int j=0;
 while(p){//   先到i-1个节点
 p=p->next;
 j++;//
 if(j==x-1)
 {
   LinkList s;
    s=(LinkList)malloc(sizeof(LNode));
   s->data=i;
   s->next=p->next;
   p->next=s;
 }
 }
}
void TraverseList_L(LinkList L) 
//依次输出单链表里的每个元素
{
  LNode *o ;
            o=L->next; //o为头结点  
  while(o)
  {
    if(o!=NULL)
    { 
      printf("%d",o->data);
      if(o->next!=NULL)
      printf(",");
        o=o->next;
    }
}
}
Status DestroyList_L(LinkList L)
{
    LinkList p;
       while(L)
        {
            p=L;  
            L=L->next;
           free(p);  
        }
     return 1 ;
 }
int main()
{
  LinkList  L; 
  int n,i ;
  ElemType e;
  L=InitList_L(L);
    scanf("%d",&n);
  CreateList_L(L,n);  
TraverseList_L(L);
  scanf("%d%d",&i,&e);
  ListInsert_L(L,i,e);
  printf("\n");
  TraverseList_L(L);
    DestroyList_L(L);
  return 0 ;
}

8.顺序表删除_新

1、定义删除函数(ListDelete_Sq)

2、在主函数中遍历输出插入前线性表中的元素

3、在主函数中输入被删元素的位置

4、显示删除后的线性表元素

例如: 输入顺序表元素个数和数据如下:

5

5  3  8  7  9

输入被删元素的位置:

2

程序输出结果为:

5,3,8,7,9    //删除元素之前输出的线性表中的数据元素

3               //输出的被删除元素

5,8,7,9      //输出删除元素之后线性表中的数据元素

# include <stdio.h>
# include <stdlib.h>
typedef struct Lnode{
    struct Lnode*next;
    int data;
}Lnode,*LinkList;
LinkList Inint_L(LinkList L)
{
  L=(LinkList) malloc (sizeof(Lnode));
  L->next=NULL;
}
void shuru(LinkList L,int n)
{     LinkList q;
          q=L;
      LinkList p;
          for(int i=0;i<n;i++)
          {
            p=(LinkList) malloc (sizeof(Lnode));
            scanf("%d",&p->data);
            p->next=NULL;
            q->next=p;
      q=p;
      }
}
void shuchu(LinkList L)
{
  LinkList p;
  p=L->next;
  while(p)
  {
    printf("%d",p->data);
    p=p->next;
    if(p!=NULL)
    {
      printf(",");
    }
  }
}
 int shanchu(LinkList L,int i)
 {
  printf("\n");
  int j=0;
  LinkList p,q;
  p=L;//L为头指针   只有指向  无内容  next域存首元结点地址  
  while(j<i-1&&p->next)
  {
      p=p->next;//   1-0. p指向寿元节点   i-1--- i-2=j 
      j++;
   }
  if(!(p->next)||(j>i-1))
  {
    return -1;
   }
q=p->next;   // q为要找的节点  p为前一个节点
p=q->next;   // 存   第i个节点的下一个地址
q->next=p->next;   //p为前一个节点   进行重新连接  
int e=p->data;
printf("%d\n",e);
free(p);
  return 1;
 }
int main()
{
  LinkList L;
  L=Inint_L(L);
  int n;
  scanf("%d",&n);
  shuru(L,n);
  shuchu(L);
  int i,e;
  e=shanchu(L,scanf("%d",&i));
  shuchu(L);
  return 0;
}

9.单链表的查找-按序号查找_新

1、定义按序查找函数(GetElem_Sq)

2、在主函数中输出插入新结点之前单链表中的结点信息(TraverseList_L)

3、在主函数中输入待查元素在单链表中的位序

4、显示查找后的数据

例如: 输入单链表结点个数和数据如下:

5

5  3  8  7  9

输入查找结点的位序为:

2

程序输出结果为:

5,3,8,7,9     // 插入新结点之前输出的单链表中的结点信息

3                 //输出该位置上的结点信息

# include <stdio.h>
# include <stdlib.h>
/*1、定义按序查找函数(GetElem_Sq)
2、在主函数中输出插入新结点之前单链表中的结点信息(TraverseList_L)
3、在主函数中输入待查元素在单链表中的位序
4、显示查找后的数据
例如: 输入单链表结点个数和数据如下:
5
5  3  8  7  9
输入查找结点的位序为:
2
程序输出结果为:
5,3,8,7,9     // 插入新结点之前输出的单链表中的结点信息
3                 //输出该位置上的结点信息*/
typedef struct Lnode{
  int data;
  struct Lnode *next;
}Lnode ,*LinkList;
  LinkList Init_L(LinkList L)
{
  L=(LinkList) malloc (sizeof(Lnode));
  L->next=NULL;
  return L;
}
     void  shuru (LinkList L,int n)
{
L->next=NULL;
  LinkList q,p;
  p=L;
  for(int i=0;i<n;i++)
  {
    q=(LinkList) malloc (sizeof(Lnode));
    scanf("%d",&q->data);
    q->next=NULL;
  p->next=q;
  p=q;  
  }
}
void shuchu(LinkList L)
{
  LinkList q,p;
  q=L;
  while(q->next)
  {
    p=q->next;
    if(p->next!=NULL)
    printf("%d,",p->data);
    else
    printf("%d",p->data);  
    q=q->next;
  }
}
int chazhao(LinkList L,int i)
{
  LinkList p,q;
    int j=1;
    p=L;
  while(p->next)
  {
    p=p->next;
    j++;
    if(j==i)
{
  p=p->next;
  return p->data; 
    }   
  }
}
int main()
{
  int n,i,e;
  scanf("%d",&n);
  LinkList L;
L=Init_L(L);
//  printf("jjjjjjjjjj"); 
            shuru(L,n);
  shuchu(L);
  printf("\n");
  scanf("%d",&i);
  e=chazhao(L,i);
  printf("%d",e);
  return 0;
}

10.单链表结点的删除_ 新

1、定义删除函数(ListDelete_L

2、在主函数中遍历输出删除前单链表中的结点信息

3、在主函数中输入被删结点的位置

4、显示删除后的单链表的结点信息

例如: 输入单链表结点个数和数据如下:

5

5  3  8  7  9

输入被删结点的位置:

2

程序输出结果为:

5,3,8,7,9    //删除结点之前遍历输出的单链表中的结点信息

3                //输出被删除结点的结点信息

5,8,7,9      //删除结点之后遍历输出的单链表中的结点信息

# include <stdio.h>
# include <stdlib.h>
typedef struct Lnode{
    struct Lnode*next;
    int data;
}Lnode,*LinkList;
LinkList Inint_L(LinkList L)
{
  L=(LinkList) malloc (sizeof(Lnode));
  L->next=NULL;
}
void shuru(LinkList L,int n)
{     LinkList q;
          q=L;
      LinkList p;
          for(int i=0;i<n;i++)
          {
            p=(LinkList) malloc (sizeof(Lnode));
            scanf("%d",&p->data);
            p->next=NULL;
            q->next=p;
      q=p;
      }
}
void shuchu(LinkList L)
{
  LinkList p;
  p=L->next;
  while(p)
  {
    printf("%d",p->data);
    p=p->next;
    if(p!=NULL)
    {
      printf(",");
    }
  }
}
 int shanchu(LinkList L,int i)
 {
  printf("\n");
  int j=0;
  LinkList p,q;
  p=L;//L为头指针   只有指向  无内容  next域存首元结点地址  
  while(j<i-1&&p->next)
  {
      p=p->next;//   1-0. p指向寿元节点   i-1--- i-2=j 
      j++;
   }
  if(!(p->next)||(j>i-1))
  {
    return -1;
   }
q=p->next;   // q为要找的节点  p为前一个节点
p=q->next;   // 存   第i个节点的下一个地址
q->next=p->next;   //p为前一个节点   进行重新连接  
int e=p->data;
printf("%d\n",e);
free(p);
  return 1;
 }
int main()
{
  LinkList L;
  L=Inint_L(L);
  int n;
  scanf("%d",&n);
  shuru(L,n);
  shuchu(L);
  int i,e;
  e=shanchu(L,scanf("%d",&i));
  shuchu(L);
  return 0;
}

11.线性表的合并_新

假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合 A=A∪B,例如,设LA=(7  5   3  11 ),LB=( 2  6  3),合并后LA=(7  5  3  11   2  6)

1、定义线性表的顺序存储结构

2、初始化线性表(InitList_Sq)

3、创建线性表(CreateList_Sq)

4、定义线性表的合并函数(unionList_Sq),将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中,

  (在合并函数中,还将包含对函数ListLengtht_Sq、ListInsert_Sq、LocateElem_Sq和GetElem_Sq的调用)

5、在主函数中输入两个线性表LA,LB,调用合并函数

6、遍历合并后的线性表LA,并输出数据(TraverseList_Sq)

例如:

输入线性表LA的元素个数和数据如下:

4

7  5   3  11

输入有序表LB的元素个数和数据如下:

3

2  6  3

输出为:

7,5,3,11          //输出线性表LA的数据元素

2,6,3              //输出线性表LB的数据元素

7,5,3,11,2,6    //输出合并后的线性表LA的数据元素

# include <stdio.h>
# include <stdlib.h>
# define MAXSIZE 100
typedef struct SeqList{
    int *elem;
    int length;
}SeqList;
void Init_S(SeqList *L)
{
    L->elem=(int*)malloc (sizeof(int)*MAXSIZE);
    L->length=0;
}
 int chuangjian(SeqList *L,int n)
{
  for(int i=0;i<n;i++)
  {
    scanf("%d",&L->elem[i]);
    ++L->length;
  }
  return 1;
}
  int getelem(SeqList *L,int i)
{
//printf("%d",L->elem[i-1]);
int u=L->elem[i-1];
return (u);
}
  int  bijiao(SeqList * L,int y )
{
  for(int i=0;i<L->length;i++)
  {
    if(L->elem[i-1]==y)
    return 6;
  }
   return 7 ;
}
SeqList* hebing(SeqList *La,SeqList Lb)
{
  int y;
  int p;
  int i=1;
  for(i=1;i<=Lb.length;i++)
  {//printf("jjjj");
    y=getelem(&Lb,i);
    p=bijiao(La,y);
    if(p==6)
    {
      continue;
    } 
    if(p==7)
    {
        ++La->length;
        La->elem[La->length-1]=y;
    } 
      }
  return La;
}
void shuchu(SeqList *L,int n)
{
  for(int i=0;i<n;i++)
  {
    if(i!=n-1)
    {
      printf("%d,",L->elem[i]);
    }
    if(i==n-1)
    {
      printf("%d",L->elem[i]);
    }
  }
  } 
int main()
{
  SeqList La,Lb;
  Init_S(&La);
  Init_S(&Lb);
  int n1,n2;
  scanf("%d",&n1);
  chuangjian(&La,n1);
  shuchu(&La,n1);
  printf("\n");
  scanf("%d",&n2);
  chuangjian(&Lb,n2);
  shuchu(&Lb,n2);
  printf("\n");
  hebing(&La,Lb);
  shuchu(&La,La.length);
  return 0;
}

12.有序表的合并_新

已知线性表LA 和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.

1、定义有序表合并函数(MergeList_Sq),将两个非递减的有序表LA和LB合并为一个新的有序表LC,且LC中的数据元素仍按值非递减有序排列

  (在合并函数中,还将包含对ListLength_Sq的调用)

2、在主函数中输出LA表的数据元素(TraverseList_Sq)

3、在主函数中输出LB表的数据元素(TraverseList_Sq)

4、在主函数中输入两个非递减的有序表LA,LB,调用合并函数

5、遍历合并后的有序表LC,并输出数据(TraverseList_Sq)

例如:

输入有序表LA的元素个数和数据如下:

4

2  5  8  9

输入有序表LB的元素个数和数据如下:

6

3  4  8  10  12  20  

输出为:

2,5,8,9                    //输出LA表的数据元素

3,4,8,10,12,20       //输出LB表的数据元素

2,3,4,5,8,8,9,10,12,20  //输出合并后的LC表的数据元素

/*已知线性表LA 和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.
1、定义有序表合并函数(MergeList_Sq),将两个非递减的有序表LA和LB合并为一个新的有序表LC,且LC中的数据元素仍按值非递减有序排列
   (在合并函数中,还将包含对ListLength_Sq的调用)
2、在主函数中输出LA表的数据元素(TraverseList_Sq)
3、在主函数中输出LB表的数据元素(TraverseList_Sq)
4、在主函数中输入两个非递减的有序表LA,LB,调用合并函数
5、遍历合并后的有序表LC,并输出数据(TraverseList_Sq)
例如:
输入有序表LA的元素个数和数据如下:
4
2  5  8  9
输入有序表LB的元素个数和数据如下:
6
3  4  8  10  12  20   
输出为:
2,5,8,9                    //输出LA表的数据元素
3,4,8,10,12,20       //输出LB表的数据元素
2,3,4,5,8,8,9,10,12,20  //输出合并后的LC表的数据元素*/
# include <stdio.h>
# include <stdlib.h>
# define MAXSIZE 100
typedef struct SeqList{
    int *elem;
    int length;
}SeqList;
void Init_S(SeqList *L)
{
    L->elem=(int*)malloc (sizeof(int)*MAXSIZE);
    L->length=0;
}
 int chuangjian(SeqList *L,int n)
{
  for(int i=0;i<n;i++)
  {
    scanf("%d",&L->elem[i]);
    ++L->length;
  }
  return 1;
}
/*int getelem(SeqList *L,int i)
{
//printf("%d",L->elem[i-1]);
int u=L->elem[i-1];
return (u);
}*/
void hebing(SeqList La,SeqList Lb,SeqList* Lc)
 {
         int p=0,q=0,k=0;
         int f=La.length;
         int e=Lb.length;
       Lc->length=e+f;
while(p<f&&q<e)
{
  if(La.elem[p]<=Lb.elem[q])
      {
        Lc->elem[k]=La.elem[p];             
      k++;
        p++;
    }
  else
  {
    Lc->elem[k]=Lb.elem[q];
    k++;
    q++;
  }
}
while(p<La.length)
{
  Lc->elem[k]=La.elem[p];
  k++;
  p++;
}
while(q<Lb.length)
{
  Lc->elem[k]=Lb.elem[q];
  k++;
  q++;
}}
void shuchu(SeqList *L,int n)
 {
  for(int i=0;i<n;i++)
  {
    if(i!=n-1)
    {
      printf("%d,",L->elem[i]);
    }
    if(i==n-1)
    {
      printf("%d",L->elem[i]);
    }
  }
}
  int main()
  {
    SeqList La;
    SeqList Lb;
    SeqList Lc;
    Init_S(&La);
    Init_S(&Lb);
    Init_S(&Lc);
    int n1,n2;
    scanf("%d",&n1);
    chuangjian(&La,n1);
    shuchu(&La,n1);
    printf("\n");
    scanf("%d",&n2);
    chuangjian(&Lb,n2);
    shuchu(&Lb,n2);
    printf("\n");
      hebing(La,Lb,&Lc);
      int t=Lc.length;
    //  printf("\n");
  //printf(",,,,");
      shuchu(&Lc,t);
    return 0;
  }

13.有序链表的合并_新

已知线性表LA 和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.

1、用后插法创建单链表数据(CreateList_L)

2、定义遍历函数输出单链表数据(TraverseList_L)

3、定义有序链表合并函数(MergeList_L),将两个非递减的有序链表LA和LB合并为一个新的有序链表LC,且LC中的结点元素仍按值非递减有序排列

4、在主函数中输出LA和LB表的结点信息(TraverseList_L)

5、在主函数中调用合并函数(MergeList_L)

6、遍历合并后的有序链表LC,并输出结点信息(TraverseList_L)

例如:

输入有序链表LA的结点个数和数据如下:

4

2  5  8  9

输入有序链表LB的结点个数和数据如下:

6

3  4  8  10  12  20  

输出为:

2,5,8,9                    //输出LA表的结点信息

3,4,8,10,12,20               //输出LB表的结点信息

2,3,4,5,8,8,9,10,12,20          //输出合并后的LC表的结点信息

/*已知线性表LA 和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.
1、用后插法创建单链表数据(CreateList_L)
2、定义遍历函数输出单链表数据(TraverseList_L)
3、定义有序链表合并函数(MergeList_L),将两个非递减的有序链表LA和LB合并为一个新的有序链表L`C,且LC中的结点元素仍按值非递减有序排列
4、在主函数中输出LA和LB表的结点信息(TraverseList_L)
5、在主函数中调用合并函数(MergeList_L)
6、遍历合并后的有序链表LC,并输出结点信息(TraverseList_L)
例如:
输入有序链表LA的结点个数和数据如下:
4
2  5  8  9
输入有序链表LB的结点个数和数据如下:
6
3  4  8  10  12  20   
输出为:
2,5,8,9                    //输出LA表的结点信息
3,4,8,10,12,20               //输出LB表的结点信息
2,3,4,5,8,8,9,10,12,20          //输出合并后的LC表的结点信息
*/
# include <stdio.h>
# include <stdlib.h>
typedef struct Lnode{
  int data;
struct Lnode * next;
}Lnode,*LinkList;
LinkList Init_L(LinkList L)
{
  L=(LinkList)malloc (sizeof(Lnode));
  L->next=NULL;
  return L;
}
  void shuru(LinkList L,int n)                  
    {
      LinkList q,p;
    p=L;    
    for(int i=0;i<n;i++)
  {
  q=(LinkList) malloc(sizeof(Lnode)); 
  scanf("%d",&(q->data));     //
  q->next=NULL;
  p->next=q;
  p=q;
   } 
     }
    void shuchu(LinkList L)
        {
        LinkList q;
        q=L;
        while(q->next!=NULL)
        {
          q=q->next;
          if(q->next)
          {
            printf("%d,",q->data);
      }
          else
          {
            printf("%d",q->data);
      }
    }
    }
               LinkList hebing(LinkList La,LinkList Lb,LinkList Lc)
         {
          LinkList pc;
          LinkList pa;
          LinkList pb;
          pa=La->next;
          pb=Lb->next;
           Lc=La;
           pc=Lc; 
          while(pa&&pb)
          {  
        if(pa->data<=pb->data)
        {//printf("lllllllll");
          pc->next=pa;
          pc=pa;
          pa=pa->next;
             }    
        else
        {
          pc->next=pb;
          pc=pb;
          pb=pb->next;
        }
           }
      if(pa)
      pc->next=pa;
      if(pb)
      pc->next=pb;
        //  pc->next=pa?pa:pb;
         }  
       int main()
       {
        LinkList La;
        LinkList Lb;
        LinkList Lc;
       int n1;
        scanf("%d",&n1);
        La=Init_L(La);
        shuru(La,n1);
        shuchu(La);
        printf("\n");
             int n2;
        scanf("%d",&n2);
        Lb=Init_L(Lb);
        shuru(Lb,n2);
        shuchu(Lb);
        printf("\n");
        hebing(La,Lb,Lc);
        shuchu(La);
        return 0;
     }


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
124 2
|
29天前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
29 6
|
8天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
20 1
|
5月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
46 0
|
29天前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
52 0
|
1月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
33 0
|
2月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
5月前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
58 5
|
5月前
|
存储 测试技术
【数据结构】操作受限的线性表,队列的具体实现
【数据结构】操作受限的线性表,队列的具体实现
44 4