第三组两个有序表合并

Posted hamawep

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三组两个有序表合并相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<stdlib.h>

typedef struct List
{
 int data;
 struct List *next;
} List;

List *createlist();
void printflist(List *pre);
List *sort(List *head);
List *add(List *L1,List *L2);

int main()
{
   List *L1,*L2,*L3,*L;
   L1=createlist();
   L2=createlist();
   L3=add(L1,L2);
   L=sort(L3);
   printflist(L) ;
}

List *createlist()
{
 List *L,*p,*q;
    L=(List*)malloc(sizeof(List*));
    L->next=NULL;
 p=L;
    int m;
 scanf("%d",&m);
 if(m!=-1)
 {
  L->data=m;
  p=L;
 } 
 else
     return 0;
     scanf("%d",&m);
 while(m!=-1)
 {
  q=(List*)malloc(sizeof(List*));
  q->data=m;
  p->next=q;
  p=q;
  scanf("%d",&m);
 }
 p->next=NULL;
 return L;
}

List *add(List *L1,List *L2)
{
 List *p,*q,*pre,*r;
 p=L1->next;
 pre=L1;
 q=L2;
 r=pre;
 while(p!=NULL)
 {
    pre->next=p;
    pre=pre->next;
    p=p->next; 
    }
    while(q!=NULL)
    {
     pre->next=q;
     pre=pre->next;
     q=q->next;
    }
    pre->next=NULL;
    return r;
}

void printflist(List *L)
{
 while(L)
 {
  if(L->next!=NULL)
  {
     printf("%d ",L->data);
     }
     else
        printf("%d",L->data);
     L=L->next;
 }
}

List *sort(List *head)
{
 List *p,*pre,*q;
 p=head->next->next;
 head->next->next=NULL;
 while(p!=NULL)
 {
  q=p->next;
  pre=head;
  while(pre->next!=NULL&&pre->next->data<p->data)
     pre=pre->next;
  p->next=pre->next;
  pre->next=p;
  p=q;  
 }
 return head;
}

 

这又合并两条单链表并排序的题目呢,在PTA上未能实现满分。

主要有一下几点错误;

1.当输入第一条链表的第一个数字为-1时,程序就无法运行。

2.组员对指针的移动掌握不熟悉,常常使指针指向错误。

3.部分组员的printList函数出错,主要是对题目没有认真审题,对题目要求的末尾无空格没有特殊处理。

4.对于结构体,结构体函数和typedef的运用不熟悉。

5.对链表指针与指向指针的指针概念混淆。

未解决错误的第一点。

希望老师能对链表指针与指向指针的指针给我们做个辨析。

以上是关于第三组两个有序表合并的主要内容,如果未能解决你的问题,请参考以下文章

归并排序

算法热门:合并两个有序链表(LeetCode 21)

合并两个有序链表【递归、迭代】

栈和队列----合并两个有序的单链表

合并两个有序单链表

合并两个有序的单链表,合并之后的链表依然有序出现频率高