第三组两个有序表合并

#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.对链表指针与指向指针的指针概念混淆。

未解决错误的第一点。

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

时间: 2024-10-01 04:51:30

第三组两个有序表合并的相关文章

算法--两个有序数组合并

两个有序数组合并 关键点:从后往前进行比较,这样保证数组A有用的部分不会因为在合并的过程中覆盖掉 第15节 有序数组合并练习题 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class Merge {

将两个有序链表合并

题目:已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序.(保留所有结点,即便大小相同) 循环实现: 1.重新申请一个头结点,使用指针p指向他,每新加一个结点,就将指针p后移一位,即指针p永远指向新链表的尾结点 2.由于所用链表第一个结点不赋值,因此指针需要开始从头结点的下一个结点开始判断,如果两个指针都为非空,将data域较小的指针连在新链表的末尾 3.当两个指针有一个到达链表的结尾时,将没有到达末尾的链表连接到新链表之后 递归实现: 1.函数返回条件是有一个链表结

两个有序数组合并成一个有序数组

两个有序数组合并成一个有序数组 1. 题目描述 数组a是有序的,数组b也是有序的,如何高效地合并它们成一个数组,并且新数组也是有序的? 2. 从后往前合并 这道题目是师兄电面阿里的时候,问到的一道题目.现在我们来说一下解法~ 假设数组a足够长,可以在数组a上合并二者.我们的解法基本思想就是从后往前合并数组. 每次合并的时候,都要比较a和b当前数组的大小,取较大的值后移,注意一定要是后移! 为什么从后往前呢?其实就是为了方便后移,因为较大的一定是在后面的. 程序如下: #include<iostr

C语言:对传入sp的字符进行统计,三组两个相连字母“ea”&quot;ou&quot;&quot;iu&quot;出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 #pragma warning (disable:4996) 4 void fun(char*sp ,int *ct) 5 { 6 int a=0, b=0, c=0; 7 while (*sp != '\0') 8 { 9 if (*s

两个线性表合并

数组方法(前提是两个顺序表都已排序,若未排序,则自己先排序再合并) #include<iostream> using namespace std; //创建顺序表 void create(int A[],int length){ for(int i=0;i<length;i++){ cin>>A[i]; } } //打印顺序表 void show(int A[],int length){ cout<<A[0]; for(int i=1;i<length;i+

两个有序数组合并算法

有两个有序数组A和B,如果把A和B合并起来到C中,具体算法如下: public static int [] MergeArray(int[] ArrayLeft, int[] ArrayRight)// { int length = ArrayLeft.Length + ArrayRight.Length; int[] ArrayMerge = new int[length]; int i = 0; int j = 0; while (i < ArrayLeft.Length &&

算法 - 两个有序数组合并成一个有序数组

//两个有序数组的合并函数 public static int[] MergeList(int a[],int b[]) { int result[]; if(checkSort(a) && checkSort(b)) //检查传入的数组是否是有序的 { result = new int[a.length+b.length]; int i=0,j=0,k=0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while(i<a.length &&

两个有序数组合并为一个有序数组

突然想到了这个算法,记得以前看过,但是没写,怕自己会写不出这个算法,于是就把它用JAVA写出来,呵呵. 思想:先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. 代码: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 class ArraySort{ //两个有序数组

Python版将两个有序数组合并为一个有序数组

第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性.(不好) 第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到其中一个数组长度为0.然后再把不为空的老数组中剩下的部分加到新数组的结尾.(好) 第二种思路的排序算法与测试代码如下: def merge_sort(a, b): ret = [] while len(a)>0 and len(b)>0: if a[0] <= b[0]: ret.appen