数据结构>>线性表【注意】-->链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目
 * A、B是两个递增有序的单链表,元素个数分别是m和n,求
 * 集合A-B,并将结果保存在A中,且仍然保持递增有序。
 * converge_ab
 */

#include <iostream.h>
using namespace std;

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

int main(){
    lnode * create_chain(int num,int interval,int start);
    void converge_ab(lnode *A,lnode *B);
    lnode * A,*B,*q,*p;
    int m=4,n=7;

     A=create_chain(4,3,2);        //2 5 8 11
     B=create_chain(7,4,1);        //1 5 9 13 17 21 25
     p=A;
/*      while(p->next != NULL){
            cout << p->next->data <<" ";
            p=p->next;
        }
      cout << endl;
     q=B;
      while(q->next != NULL){
            cout << q->next->data <<" ";
            q=q->next;
        }
      cout << endl;
    converge_ab(A,B,m,n);
      p=A;
*/
     converge_ab(A,B);
     p=A;
      while(p->next != NULL){
            cout << p->next->data <<" ";
            p=p->next;
        }

}

lnode * create_chain(int num,int interval,int start){
    lnode * head=(lnode *)malloc(sizeof(lnode)),*p,*q=head;
    int i;
    for(i=0;i<num;i++){
        p=(lnode *)malloc(sizeof(lnode));
        p->data=start+(i*interval);
        p->next=NULL;
        q->next=p;
        q=q->next;
    }
    return head;
}

void converge_ab(lnode *A,lnode *B){
    lnode * q=B->next,* r=A,* temp;
    while(r->next!=NULL && q!=NULL){
        if(r->next->data < q->data){
            r=r->next;
        }else if(r->next->data == q->data){
            temp=r->next;
            r->next=temp->next;
            free(temp);
        }else{
            q=q->next;
        }
    }
}

这里之前犯的错误是将后面的写成三个if,而不是else if。它们的区别在于:

如果是三个if, 这三个if在条件成立的情况下都会执行,假设第一个if已经执行了,这时r是改变了的,这样一旦改变了的r也符合后面的标准,就会继续执行下面的if

如果是if else的话,会选if...else if....else...里面三种情况之一来执行,执行完之后就会退出来,进行下一轮的循环。

(使两者等价的做法是将3个if的那种情况中,里面每一个if里面的最后加上continue)

数据结构>>线性表【注意】-->链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序),布布扣,bubuko.com

时间: 2024-10-15 19:46:33

数据结构>>线性表【注意】-->链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)的相关文章

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

C语言 严蔚敏数据结构 线性表之链表实现

博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直接上代码,现阶段代码实现功能有:链表初始化.遍历.增.删.返回链表长度,后续功能陆续发布.其中肯定有很多问题,希望各位码哥留言. Linklist* InitList(int i)//i为链表大小 { Linklist *head; head = (Linklist*)malloc(sizeof(L

再回首,数据结构——线性表、链表上的常见算法

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. //1.编写算法实现线性表就地逆置的操作 void InverseList (SeqList l) { for (i = 0; i <= (l.length-1)/2; i++) { l.elem[i] <-> l.elem[l.length-1-i]; } } //2.从顺序表中删除自第i个元素开始的k个元素 void DeleteList(SeqList l, int

数据结构-线性表-静态链表

对于线性链表,也可用一维数组来进行描述.这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构. 静态链表是利用数组来实现,只是改变了实现方式,实际上链式存储说的存储的方式,数组只是实现的方式,不能将静态链表看做是顺序存储. 数组的元素都是由两个数据域组成,data和cur.也就是说,数组的每一个下标都对应一个data和一个cur. 数据域data用来存放数据元素,也就是通常我们要处理的数据:而游标cur相当于单链表中的next指针, 存放该元素的后继在数组中的下标.我们把这种用数组描述

Java数据结构-线性表之链表应用-检测链表是否有环

??如何检测一个链表是否有环?这个是一个出现频率较高的面试题. ??如下是一个含有环的链表. (图片来自http://www.nowamagic.net/librarys/veda/detail/2245 一个有很多关于数据结构的文章的网站,还有其他的资料,可以看看) 我这里解题的方法有三种: 快慢指针方法:两个速度不一样的指针遍历总会相遇: 利用环的顶点数和边相等的关系: 两个指针遍历判断步数是否相等. ??为了实现检查链表是否含有环的情况,我们需要先构建出一个含有环的链表. ??于是乎我在之

(源代码见大话数据结构)线性表—静态链表

#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 1000 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALS 0 typedef int ElemType; typedef int Status; typedef struct { ElemType data; int cur; } Component,Stati

数据结构 线性表—单链表

本文只要实现单链表的初始化.插入(尾插.头插.任意位置插入).删除(尾删.头删.删除指定元素).查找等. 定义单链表 typedef int DataType; typedef struct LinkNode {  DataType data;  struct LinkNode *next; }LinkNode, *pLinkNode, *pList; 实现单链表的所有接口: void InitLinkList(pList* pHead);//单链表的初始化 void Destroy(pList

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

C# 数据结构 线性表(顺序表 链表 IList 数组)

线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. (2)线性表中的元素是有限的(List),线性表中的数据类型一致. (3)线性表表示方法 L={a1,a2,a3,a4…….an},L=(D,R) (4)每一个元素都有前驱和后继,第一个元素只有后继,最后一个元素只有前驱. 实例 例如:1-100的整数是一个线性表 {“zhangsan”, “lis