日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(C语言)链表的实现集合的相关操作

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (C语言)链表的实现集合的相关操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:https://blog.csdn.net/kobe_jr/article/details/80543611

集合的特征:確定性/ 互異性/ 無序性。

常見的操作:1、查找集合中是否包含這個數據元素:Contains();

2、添加一個新成員數據,集合中不能存在這個元素。AddMember();

3、刪除指定元素, 找到這個元素, 刪除;如果沒找到,則提示沒找到,返回0(表示false)。Delete();

4、合并兩個集合,不能有相同的元素。

5、求交集,找相同的元素。

6、求差集,例如:A{1, 2, 3}。B{2,4}。那么A相對B的差集就是{1,3}。

參考代碼:

  • #include<stdio.h>
  • #include<stdlib.h>
  • // 利用單鏈表進行集合操作
  • typedef int elementType;
  • typedef struct node{
  • elementType data;
  • struct node *next;
  • }SetNode; // 集合節點
  • typedef struct{
  • SetNode *first, *last;
  • }LinkSet;// 鏈式集合
  • //判斷是否含有指定元素
  • bool Contains(LinkSet &ls, elementType x){
  • // if(ls.first == ls.last){// 判斷是否是空表
  • // return 0;
  • // }
  • // 移動指針 不需要創建的
  • SetNode *p = ls.first->next;
  • while(p != NULL && p->data < x){
  • p = p->next;
  • }
  • if(p != NULL && p->data == x){
  • return 1;
  • }
  • else return 0;
  • }
  • //鏈表的插入和刪除必然需要找到前驅節點
  • //增加一個新成員
  • int addMember(LinkSet &ls, elementType x){
  • //集合中不能有重復元素
  • SetNode *p = ls.first->next;
  • //前驅節點記錄下來
  • SetNode *pre = ls.first;
  • while(p != NULL && p->data < x){
  • pre = p;
  • p = p->next;
  • }
  • if(p != NULL && p->data == x) return 0;// 存在插入失敗
  • // 創建一個新節點
  • SetNode *s = (SetNode *)malloc(sizeof(SetNode));
  • s->data = x;
  • s->next = p;// p后面的接在新節點s后面
  • pre->next = s;
  • // 假如是插在末尾
  • if(!p) ls.last = s;
  • return 1;
  • }
  • // 刪除指定節點
  • int deleteMember(LinkSet &ls, elementType x){
  • // 搜索節點
  • SetNode *p = ls.first->next, *pre = ls.first;
  • while(p != NULL && p->data < x){
  • pre = p;
  • p = p->next;
  • }
  • if(p != NULL & p->data == x){
  • pre->next = p->next;
  • if(p == ls.last) ls.last = pre;
  • free(p);
  • return 1;
  • }
  • else
  • return 0; // 其他情況視為刪除失敗 :空集合 以及 不包含該元素
  • }
  • // 合并兩個集合 : 相同元素刪除
  • void merge(LinkSet &lsA, LinkSet &lsB, LinkSet &lsC){
  • SetNode *pa = lsA.first->next, *pb = lsB.first->next;
  • SetNode *pc = lsC.first, *p;// 新的存儲空間,存儲兩個鏈表的結果
  • while(pa != NULL && pb != NULL){
  • if(pa->data < pb->data){
  • //理解為創建pc->next的這個節點
  • pc->next = (SetNode *)malloc(sizeof(SetNode));
  • pc->next->data = pa->data;// 放入到pc中去
  • pa = pa->next;
  • }
  • else if(pa->data > pb->data){
  • pc->next = (SetNode *)malloc(sizeof(SetNode));
  • pc->next->data = pb->data;// 放入到pc中去
  • pb = pb->next;
  • }
  • else if(pa->data == pb->data){// 重復元素隨意放一個, 然后一起移動
  • pc->next = (SetNode *)malloc(sizeof(SetNode));
  • pc->next->data = pa->data;
  • pa = pa->next;
  • pb = pb->next;
  • }
  • // 不斷的存儲數據 ,pc的位置也要往后移動
  • pc = pc->next;
  • }
  • // 可能還有集合沒有做完
  • p = (pa != NULL ) ? pa : pb;
  • while(p != NULL){
  • pc->next = (SetNode *)malloc(sizeof(SetNode));
  • pc->next->data = p->data;// 放入到pc中去
  • pc = pc->next;
  • p = p->next;
  • }
  • // 對于一個鏈表來說, 一定要收尾
  • pc->next = NULL;
  • lsC.last = pc;
  • }
  • void print(LinkSet &ls){
  • SetNode *p = ls.first;
  • while(p->next != NULL){
  • printf("%d ", p->next->data);
  • p = p->next;
  • }
  • printf("\n");
  • }
  • int main(){
  • LinkSet la, lb, lc;
  • // 加一個頭結點
  • la.first = (SetNode *)malloc(sizeof(SetNode));
  • la.first->next = NULL;
  • lb.first = (SetNode *)malloc(sizeof(SetNode));
  • lb.first->next = NULL;
  • lc.first = (SetNode *)malloc(sizeof(SetNode));
  • lc.first->next = NULL;
  • addMember(la, 1);
  • addMember(la, 2);
  • addMember(la, 3);
  • addMember(la, 4);
  • addMember(la, 5);
  • // 打印
  • print(la);
  • printf("%d\n", Contains(la, 5));
  • printf("%d\n", Contains(la, 6));
  • addMember(lb, 1);
  • addMember(lb, 2);
  • addMember(lb, 3);
  • addMember(lb, 7);
  • addMember(lb, 8);
  • print(lb);
  • deleteMember(lb, 3);
  • print(lb);
  • merge(la, lb, lc);
  • print(lc);
  • return 0;
  • }
  • ![在這里插入圖片描述](https://img-blog.csdn.net/20180601223558789?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvYmVfanI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)


    以上就是這篇的主要內容,歡迎您提出意見。謝謝!讓我們共同進步!

    總結

    以上是生活随笔為你收集整理的(C语言)链表的实现集合的相关操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。