1. 程式人生 > >c語言連結串列實現兩集合的交集(1)

c語言連結串列實現兩集合的交集(1)

#include <stdio.h>
#include <malloc.h>

typedef struct node {
    int num;
    struct node *next;
}AGG;

AGG *CreateList() { // 建立單迴圈連結串列,返回連結串列頭
    AGG *head,*p;
    int i,n;
    printf("結點個數n = ");
    scanf("%d",&n);
    head = p = (AGG *)malloc(sizeof(AGG)); // 專用頭結點
    head->num = 0;
    printf("輸入 %d 整數(空格隔開):\n",n);
    for(i = 0; i < n; ++i) {
        p->next = (AGG *)malloc(sizeof(AGG));
        scanf("%d",&p->next->num);
        p = p->next;
    }
    p->next = head;
    return head;
}

AGG *MutualAgg(AGG *A,AGG *B) {  // A∩B
    AGG *C,*pa,*pb,*pc,*qc;
    C = pc = (AGG *)malloc(sizeof(AGG));
    pc->num = 0;
    pa = A->next;
    pb = B;
    while(pa != A) {
        pb = B->next;
        while(pb != B) {
            if(pb->num == pa->num) {
                qc = (AGG *)malloc(sizeof(AGG));
                qc->num = pb->num;
                pc->next = qc;
                pc = qc;
            }
            pb = pb->next;
        }
        pa = pa->next;
    }
    pc->next = C;
    return C;
}



void PrintList(AGG *head) {
    AGG *p = head->next;
    short counter = 0;
    while(p != head) {
        if(counter && counter%10 == 0) printf("\n");
        printf("%5d",p->num);
        counter++;
        p = p->next;
    }
    if(counter % 10) printf("\n");
}

void freeheap(AGG *head) {
    AGG *p,*q;
    p = head;
    q = p->next;
    while(q != head) {
        p = q;
        q = p->next;
        free(p);
    }
    free(head);
}

int main() {
    AGG *A,*B,*C,*D,*E;
    printf("建立集合 A:\n");
    A = CreateList();
    printf("建立集合 B:\n");
    B = CreateList();
    printf("集合A的元素有:\n");
    PrintList(A);
    printf("集合B的元素有:\n");
    PrintList(B);
    C = MutualAgg(A,B);
    printf("交集 C = A∩B:\n");
    PrintList(C);
    freeheap(A);
    freeheap(B);
    freeheap(C);
    printf("\n\n");
    return 0;
}

相關推薦

c語言連結串列實現集合交集(1)

#include <stdio.h> #include <malloc.h> typedef struct node { int num; struct node *next; }AGG; AGG *CreateList() { /

使用C語言連結串列實現商品管理系統

#include <stdio.h> #include <stdlib.h> #include <windows.h> #define bool char #define true 1 #define false 0 #define NUM 1

C語言連結串列實現佇列操作

還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯

資料結構——連結串列集合交集

#include <stdio.h> #include <malloc.h> typedef struct Node { int data; struct Node *next; }LNode,*LinkList; LNode *C

連結串列實現集合求並集

 #include<stdio.h> #include<stdlib.h> #include<time.h>  typedef struct node{      int data;      struct node *next;  } LinkList;  LinkLis

C語言 連結串列的基本操作實現 原始碼

1 創作初衷   作為一個畢業半年,到公司上班的菜鳥程式猿,卻還沒有參與過一次實際的專案開發,沒有跟著專案寫過一行程式碼, 每天除了自學,就是做做文件之類的工作。所以在此,把之前學過的知識重新拿起來,寫成文章。   本文屬於作者 原創,轉載請註明出處!哦,也許並沒有人能看上

C語言:程式設計實現個矩陣

輸入一個3乘4矩陣✖️4乘5矩陣,輸出一個3乘5的矩陣 #include<stdio.h> int main() { int matrix1[3][4],matrix2[4][5],matrix3[3][5]; int i,j,k; int jz3[

C語言指針實現個數的互換

c語言指針 存儲 col clu stdio.h 實現 置換 形參與實參 兩個 #include <stdio.h> void change1(int a, int b)//形參與實參不是同一個變量{ int t; t = a; a = b; b = t; }

C語言連結串列(超詳細)

前言:之前學習連結串列的時候總會遇到一些問題 也看了好多人的文章感覺有些不是太實用 然後後來也是自己摸索才大概寫出來的. 在真正的開發中會把連結串列的增刪改查寫到函式裡 但是刪除有點麻煩 找了很多都是刪除第幾個 而不是刪除某個值對應的節點 讓我很難受 所以想寫一些連結串列的操作分享

5 種排序演算法--C語言連結串列

原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure/blob/master/sortIn5.c 包括: 氣泡排序 快速排序 選擇排序 插入排序 希爾排序 執行: 注意:

1870 Problem B C語言-連結串列排序

問題 B: C語言-連結串列排序 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 86  解決: 71 [提交][狀態][討論版][命題人:外部匯入] 題目描述 已有a、b兩個連結串列,每個連結

C語言連結串列的建立插入等綜合實戰

系本人原創,轉載請註明出處: 程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶, 先放上鍊表的結構體: typedef struct stud

【演算法】C++用連結串列實現一個箱子排序附原始碼詳解

01 箱子排序 1.1 什麼是分配排序? 分配排序的基本思想:排序過程無須比較關鍵字,而是通過"分配"和"收集"過程來實現排序.它們的時間複雜度可達到線性階:O(n)。 1.2 什麼是箱子排序? 箱子排序是分配排序的一種,箱子排序也稱桶排序(Bucket Sort),其基本思想是:設定若干個箱子,依次掃描待

C語言連結串列節點插入與刪除

線性表操作 順序表是我們資料結構中的基本儲存形式,現在給定一個順序表,有如下操作: Insert X Y:在順序表中X位置插入Y元素,遍歷輸出當前順序表的所有元素。 Delete X:刪除順序表中的X元素,如果有多個X元素,只刪除第一個X,遍歷輸出當前順序的所有

C語言連結串列:遍歷,頭插,尾插,中間插入;頭節點刪除,尾節點刪除,中間刪除的操作

/****************************************************************************************************************************************

一步一步教你從零開始寫C語言連結串列---構建一個連結串列

為什麼要學習連結串列? 連結串列主要有以下幾大特性: 1、解決陣列無法儲存多種資料型別的問題。 2、解決陣列中,元素個數無法改變的限制(C99的變長陣列,C++也有變長陣列可以實現)。 3、陣列移動元素的過程中,要對元素進行大範圍的移動,很耗時間,效率也不高。

從零開始的c語言連結串列學習 001--建立一個最簡單基礎的連結串列

因為各種原因,儘管c語言期末考也拿了八十多分,卻仍然對連結串列處在完全甍逼的狀態,以至於之後的資料結構課聽天書,實驗課做不出來,於是決定重學一波連結串列的知識,特此記錄筆記 001—建立一個簡單的連結串列 1.1 認識連結串列 所謂連結串列,一言蔽之就是一連串帶

C語言連結串列多項式的加法

6-3 Add Two Polynomials (20 point(s)) Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation

C語言連結串列的5種常見操作

C語言連結串列的5種常見操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第n個結點 求連結串列的中間結點 Ref typedef struct list{ int i

連結串列實現數相加

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -