当前位置: 首页 > news >正文

数据结构代码练习DAY2

在DAY1的基础上增加了一些函数

#include <stdio.h>
#include <malloc.h>typedef struct LinkNode
{int data;struct LinkNode* next;
}LNode;void CreataLNode(LNode*& L, int a[], int n)
{L = (LNode*)malloc(sizeof(LNode));LNode* r;r = L;LNode* node;for (int i = 0; i < n; i++)//用for循环将0-(n-1)下标的元素放进链表{node = (LNode*)malloc(sizeof(LNode));node->data = a[i];r->next = node;r = node;}r->next = NULL;//尾插法记得最后置空
}void PrintALL(LNode* L)
{LNode* p = L->next;while (p != NULL){printf(" %d ", p->data);p = p->next;}
}void Delete_x(LNode*& L, int x)
{LNode* pre, * p;pre = L;p = L->next;while (p != NULL){if (p->data == x){pre->next = p->next;free(p);p = pre->next;//p向后移}else{pre = p;p = p->next;}}
}void Insert_i(LNode*& L, int i,int e)
{if (L->next == NULL)return;else{LNode* pre = L;LNode* p = L->next;int count = 0;while (p != NULL){count++;if (count == i){LNode* node = (LNode*)malloc(sizeof(LNode));node->data = e;pre->next = node;node->next = p;return;}//未到第i个数据节点pre = p;p = p->next;}}
}void Find_min(LNode*& L)
{if (L->next == NULL)return;else{LNode* minpre, * minp, * pre, * p;minpre = L;minp = L->next;pre = L->next;p = pre->next;while (p != NULL){if (p->data < minp->data){minpre = pre;minp = p;}pre = p;p = p->next;}printf("min:%d", minp->data);} 
}void Delete_min(LNode*& L)//删除最小元素
{if (L->next == NULL)return;else{LNode* minpre, * minp;minpre = L;minp = L->next;LNode* pre, * p;pre = L->next;p = pre->next;while (p != NULL){if (p->data < minp->data){minpre = pre;minp = p;}pre = p;p = p->next;}minpre->next = minp->next;free(minp);}
}//D26就地逆置单链表
void Reverse(LNode*& L)
{LNode* p, * r;if (L->next == NULL)//空表,直接结束return;else{p = L->next;//先把p放在第一个数据节点上L->next=NULL;//再把头节点断链while (p != NULL)//同时判断p和r是否为空{r = p->next;p->next = L->next;L->next = p;//头插法结束p = r;//p,r最后指向同一个节点}}
}//D27将一个表拆分成两个表然后A表为奇数B表是偶数(位序相同
void Divid(LNode*& L, LNode*& A, LNode*& B)
{A = (LNode*)malloc(sizeof(LNode));B = (LNode*)malloc(sizeof(LNode));A->next = NULL;B->next = NULL;LNode* ra = A;LNode* rb = B;if (L->next == NULL)return;LNode* p = L->next;while (p != NULL){if (p->data % 2 == 0){rb->next = p;rb = p;p = p->next;}else{ra->next = p;ra = p;p = p->next;}}ra->next = NULL;rb->next = NULL;
}//删除无序单链表中的所有重复元素int main()
{int a[7] = { 2,3,4,4,6,4,2 };LNode* L;CreataLNode(L, a, 7);PrintALL(L);Delete_x(L, 4);printf("\n");PrintALL(L);printf("\n");Find_min(L);printf("\n");Insert_i(L, 3, 7);PrintALL(L);Reverse(L);printf("\n");PrintALL(L);printf("\n");LNode* A, * B;Divid(L, A, B);PrintALL(A);printf("\n");PrintALL(B);Delete_min(A);printf("删除后:\n");PrintALL(A);}

2 删除单链表中所有为x的节点

#include <stdio.h>
#include <malloc.h>typedef struct LinkNode
{int data;struct LinkNode* next;
}LNode;void CreateList(LNode*& L, int a[], int n)
{L = (LNode*)malloc(sizeof(LNode));int i = 0;LNode* r = L;for (i; i < n; i++){LNode* node = (LNode*)malloc(sizeof(LNode));node->data = a[i];r->next = node;r = node;}r->next = NULL;
}void Delete_ALLx(LNode*& L, int x)
{if (L->next == NULL)//依旧先判断 空链返回return;else{LNode* pre, * p;//若删除必须pre和p两个指针pre = L;p = L->next;while (p != NULL)//仍然存在数据节点{if (p->data == x)//1 若与x相同{pre->next = p->next;//则修改pre的指向free(p);//释放数据节点p = pre->next;//重置p指针}else//x与data不等则正常向后走{pre = p;p = p->next;}}}
}void PrintALL(LNode* L)
{LNode* p = L->next;while (p != NULL){printf(" %d ", p->data);p = p->next;}
}int main()
{int a[8] = { 2,3,4,5,2,3,2,8 };LNode* L;CreateList(L, a, 8);PrintALL(L);Delete_ALLx(L, 2);printf("\n");PrintALL(L);
}


3 求两个单调递增单链表的交集 并形成单链表c

#include <stdio.h>
#include <malloc.h>typedef struct LinkNode
{int data;struct LinkNode* next;
}LNode;void CreateList(LNode*& L, int a[], int n)
{L = (LNode*)malloc(sizeof(LNode));int i = 0;LNode* r = L;for (i; i < n; i++){LNode* node = (LNode*)malloc(sizeof(LNode));node->data = a[i];r->next = node;r = node;}r->next = NULL;
}void Delete_ALLx(LNode*& L, int x)//删除所以值为x的元素
{if (L->next == NULL)//依旧先判断 空链返回return;else{LNode* pre, * p;//若删除必须pre和p两个指针pre = L;p = L->next;while (p != NULL)//仍然存在数据节点{if (p->data == x)//1 若与x相同{pre->next = p->next;//则修改pre的指向free(p);//释放数据节点p = pre->next;//重置p指针}else//x与data不等则正常向后走{pre = p;p = p->next;}}}
}LNode* Intersection(LNode* A, LNode* B)//求AB交集(AB是单增)
{if (A->next == NULL || B->next == NULL)return NULL;else{LNode* p, * q, * r;LNode* C = (LNode*)malloc(sizeof(LNode));C->next = NULL;r = C;//尾插p = A->next;q = B->next;//准备工作完成while (p != NULL && q != NULL){if (p->data < q->data)//小的往前走{p = p->next;}else if (p->data > q->data)//小的往前走{q = q->next;}else{LNode* node = (LNode*)malloc(sizeof(LNode));node->data = p->data;r->next = node;r = node;p = p->next;//同时向前走q = q->next;}}r->next = NULL;//头插法结束,尾指针->next置空return C;}
}void PrintALL(LNode* L)
{LNode* p = L->next;while (p != NULL){printf(" %d ", p->data);p = p->next;}
}int main()
{int a[8] = { 1,2,2,3,4,5,6,7 };int b[9] = { 1,2,3,4,5,6,7,8,9};LNode* L1, *L2;CreateList(L1, a, 8);CreateList(L2,b,9);printf("L1为:");PrintALL(L1);printf("\n");printf("L2为:");PrintALL(L2);printf("\n");LNode* C = Intersection(L1, L2);printf("交集为:\n");PrintALL(C);}

核心代码


LNode* Intersection(LNode* A, LNode* B)//求AB交集(AB是单增)
{if (A->next == NULL || B->next == NULL)return NULL;else{LNode* p, * q, * r;LNode* C = (LNode*)malloc(sizeof(LNode));C->next = NULL;r = C;//尾插p = A->next;q = B->next;//准备工作完成while (p != NULL && q != NULL){if (p->data < q->data)//小的往前走{p = p->next;}else if (p->data > q->data)//小的往前走{q = q->next;}else{LNode* node = (LNode*)malloc(sizeof(LNode));node->data = p->data;r->next = node;r = node;p = p->next;//同时向前走q = q->next;}}r->next = NULL;//头插法结束,尾指针->next置空return C;}
}

一个非常重要的判断条件!

你的求交集函数Intersection可能存在一个逻辑错误,导致在某些情况下可能访问空指针,具体问题分析如下:

问题所在:循环条件错误

函数中使用的循环条件是:

while (p != NULL || q != NULL)  // 错误的循环条件

这个条件的含义是 “当pq任意一个不为空时继续循环”。但在单链表AB是递增的前提下,当其中一个链表遍历完毕(pq为空)时,另一个链表剩余的元素必然更大(因为链表递增),不可能再存在交集元素。此时继续循环会导致:

  • p已为空(q非空),后续执行p->data会访问空指针,引发程序崩溃。
  • q已为空(p非空),后续执行q->data会访问空指针,引发程序崩溃。

解决方案:修正循环条件

正确的循环条件应该是 “当pq都不为空时才继续循环”,即:  使用【与】条件!

while (p != NULL && q != NULL)  // 正确的循环条件

这样,当任意一个链表遍历完毕(pq为空)时,循环会终止,避免访问空指针。


4 求无序链表AB的交集

#include <stdio.h>
#include <malloc.h>typedef struct LinkNode
{int data;struct LinkNode* next;
}LNode;void CreateList(LNode*& L, int a[], int n)
{L = (LNode*)malloc(sizeof(LNode));int i = 0;LNode* r = L;for (i; i < n; i++){LNode* node = (LNode*)malloc(sizeof(LNode));node->data = a[i];r->next = node;r = node;}r->next = NULL;
}void Delete_ALLx(LNode*& L, int x)//删除所以值为x的元素
{if (L->next == NULL)//依旧先判断 空链返回return;else{LNode* pre, * p;//若删除必须pre和p两个指针pre = L;p = L->next;while (p != NULL)//仍然存在数据节点{if (p->data == x)//1 若与x相同{pre->next = p->next;//则修改pre的指向free(p);//释放数据节点p = pre->next;//重置p指针}else//x与data不等则正常向后走{pre = p;p = p->next;}}}
}LNode* Intersection1(LNode* A, LNode* B)//求AB交集(AB是单增)
{if (A->next == NULL || B->next == NULL)return NULL;else{LNode* p, * q, * r;LNode* C = (LNode*)malloc(sizeof(LNode));C->next = NULL;r = C;//尾插p = A->next;q = B->next;//准备工作完成while (p != NULL && q != NULL){if (p->data < q->data)//小的往前走{p = p->next;}else if (p->data > q->data)//小的往前走{q = q->next;}else{LNode* node = (LNode*)malloc(sizeof(LNode));node->data = p->data;r->next = node;r = node;p = p->next;//同时向前走q = q->next;}}r->next = NULL;//头插法结束,尾指针->next置空return C;}
}LNode* Intersection2(LNode* A, LNode* B)
{if (A->next == NULL || B->next == NULL)return NULL;else{LNode* C = (LNode*)malloc(sizeof(LNode));C->next = NULL;LNode* r = C;//尾插法LNode* p = A->next;while (p != NULL){LNode* q = B->next;while (q != NULL){if (p->data != q->data){q = q->next;}else{LNode* node = (LNode*)malloc(sizeof(LNode));node->data = p->data;r->next = node;r = node;break;}}p = p->next;}r->next = NULL;return C;}
}void PrintALL(LNode* L)
{LNode* p = L->next;while (p != NULL){printf(" %d ", p->data);p = p->next;}
}int main()
{int a[8] = { 22,56,12,11,99,56,48,1 };int b[9] = { 1,2,55,12,48,77,22,46,99};LNode* A, * B, * C;CreateList(A, a, 8);CreateList(B, b, 9);C=Intersection2(A,B);PrintALL(C);printf("\n");}

使用了双层循环来实现求交集,时间复杂度为O(N^2),还有待改进

http://www.dtcms.com/a/597394.html

相关文章:

  • 声网SDK让音视频开发效率翻倍
  • 网站图片尺寸如何免费建站
  • 360做网站和推广怎么样网站后端架构如何做
  • 从零到一构建数据驱动的业务落地
  • 测试题-6
  • 那个网站上有做婚礼布场样图的营销型网站有意义吗
  • 安卓和苹果手机通用的备忘录app测评
  • 宸建设计网站哪里能做网页建站
  • VsionMaster筛选机错误情况
  • Spring Boot 面试专题及答案
  • 利用k8s client-go库创建CRD的informer的操作流程
  • 企业网站建设的参考文献wordpress的小程序
  • MATLAB视频目标追踪中的块匹配算法详解
  • Xilinx FIFO Generate IP核(9):FIFO清空操作详解
  • 网站后台建设公司永久免费云主机
  • 佛山市建设工程交易中心网站运营怎么自学
  • 【开题答辩全过程】以 基于Python的Bilibili平台数据分析与可视化实现为例,包含答辩的问题和答案
  • 转转客服IM聊天系统背后的技术挑战和实践分享
  • ansible使用教程
  • 图文设计公司起名长春seo公司长春网站设计
  • 搜索引擎seo如何优化怎样优化关键词到首页
  • 如何有效阅读Python开源项目的源代码?
  • 传输控制协议TCP
  • iOS开发系列--Swift语言
  • 《Spring Framework 核心原理与实践指南》
  • Java 开发 - 粘包处理器 - 基于分隔符实现
  • 高阅读量CSDN文章分析
  • Linux基本命令与工具(一)
  • 类似12306网站开发行唐县网站建设
  • 基于Django实现的智慧校园考试系统-自动组卷算法实现