> 文档中心 > 数据结构51道基础题之线性表13题

数据结构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#include#define MAXSIZE 100typedef 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 # include 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;idata)); 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 # include #define  MAXSIZE 100  #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef 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;idata); 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 #include#define  MAXSIZE 100  #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef 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(nMAXSIZE){    return ;}for(int i=0;ielem[i]);    L->length++;}}    //在此处定义顺序表插入函数ListInsert_Sqvoid ListInsert_Sq(SqList *L,int m,int e){    if(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;ilength;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 #include#define  MAXSIZE 100  #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef 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;ielem[i]);}}void TraverseList_Sq(SqList *L,int n){  for(int k=0;kelem[k]); } if(k!=0){ printf(",%d",L->elem[k]); }    }}Status GetElem_Sq(SqList *L,int n){    for(int i=0;ielem[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_SqGetElem_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 #include#define  MAXSIZE 100  #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef 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;ielem[i]);   }}void TraverseList_Sq(SqList *L,int n){for(int i=0;ielem[i]);    if(i!=n-1)    printf("%d,",L->elem[i]);}}//在此处定义按值查找函数 LocateELem_SqStatus LocateELem_Sq(SqList * L,int n, int e){//printf("hell");    for(int i=0 ;ielem[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 # include 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;idata);    //printf("jjj");    q->next=NULL;    p->next=q;    p=q;}}//在此处定义单链表的插入函数ListInsert_LStatus 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 # include 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;idata);   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(jnext) { 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 # include /*1、定义按序查找函数(GetElem_Sq)2、在主函数中输出插入新结点之前单链表中的结点信息(TraverseList_L)3、在主函数中输入待查元素在单链表中的位序4、显示查找后的数据例如: 输入单链表结点个数和数据如下:55  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;idata);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);elseprintf("%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 # include 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;idata);   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(jnext) { 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 # include # define MAXSIZE 100typedef 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;ielem[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;ilength;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;ilength;  La->elem[La->length-1]=y;}}return La;}void shuchu(SeqList *L,int n){for(int i=0;ielem[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的元素个数和数据如下:42  5  8  9输入有序表LB的元素个数和数据如下:63  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 # include # define MAXSIZE 100typedef 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;ielem[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]elem[k]=La.elem[p]; k++;      p++;  }else{Lc->elem[k]=Lb.elem[q];k++;q++;}}while(pelem[k]=La.elem[p];k++;p++;}while(qelem[k]=Lb.elem[q];k++;q++;}}void shuchu(SeqList *L,int n) {for(int i=0;ielem[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的结点个数和数据如下:42  5  8  9输入有序链表LB的结点个数和数据如下:63  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 # include 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;idata));     //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->datadata)  {//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;   } 


总结

数据结构线性表部分是我们开头学的,或许刚接触会感觉不是适应,但常说习惯就好。线性表也是整个数据结构的基础。