第四周 项目3 单链表的应用

  1. /*    
  2. *Copyright (c) 2015,烟台大学计算机学院    
  3. *All rights reserved.    
  4. *文件名称:test.cpp    
  5. *作者:杨俊杰  
  6. *完成日期:2016年9月23日
  7. *版本号:v1.0    
  8. *    
  9. *问题描述:单链表  
  10. *输入描述:    
  11. *程序输出:  拆分后的单链表  
  12. */       
  13.   
  14.   
  15. #include <stdio.h>  
  16. #include <malloc.h>  
  17. typedef int ElemType;  
  18. typedef struct LNode        //定义单链表结点类型  
  19. {  
  20.     ElemType data;  
  21.     struct LNode *next;     //指向后继结点  
  22. }LinkList;  
  23. void split(LinkList *&L,LinkList *&L1,LinkList *&L2);  
  24. void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表  
  25. void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表  
  26. void InitList(LinkList *&L);  //初始化线性表  
  27. void DestroyList(LinkList *&L);  //销毁线性表  
  28. bool ListEmpty(LinkList *L);  //判断线性表是否为空  
  29. int ListLength(LinkList *L);  //求线性表长度  
  30. void DispList(LinkList *L);  //输出线性表  
  31. bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值  
  32. int LocateElem(LinkList *L,ElemType e);  //按元素值查找  
  33. bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素  
  34. bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素  
  35.   
  36. void split(LinkList *&L,LinkList *&L1,LinkList *&L2)  
  37. {  
  38.     LinkList *p=L->next,*q,*r1; //p指向第1个数据节点  
  39.     L1=L;       //L1利用原来L的头节点  
  40.     r1=L1;                  //r1始终指向L1的尾节点  
  41.     L2=(LinkList *)malloc(sizeof(LinkList));    //创建L2的头节点  
  42.     L2->next=NULL;          //置L2的指针域为NULL  
  43.     while (p!=NULL)  
  44.     {  
  45.         r1->next=p;         //采用尾插法将*p(data值为ai)插入L1中  
  46.         r1=p;  
  47.         p=p->next;          //p移向下一个节点(data值为bi)  
  48.         q=p->next;          //由于头插法修改p的next域,故用q保存*p的后继节点  
  49.         p->next=L2->next;   //采用头插法将*p插入L2中  
  50.         L2->next=p;  
  51.         p=q;                //p重新指向ai+1的节点  
  52.     }  
  53.     r1->next=NULL;          //尾节点next置空  
  54. }  
  55. void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表  
  56. {  
  57.     LinkList *s;  
  58.     int i;  
  59.     L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点  
  60.     L->next=NULL;  
  61.     for (i=0; i<n; i++)  
  62.     {  
  63.         s=(LinkList *)malloc(sizeof(LinkList));//创建新结点  
  64.         s->data=a[i];  
  65.         s->next=L->next;            //将*s插在原开始结点之前,头结点之后  
  66.         L->next=s;  
  67.     }  
  68. }  
  69.   
  70. void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表  
  71. {  
  72.     LinkList *s,*r;  
  73.     int i;  
  74.     L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点  
  75.     L->next=NULL;  
  76.     r=L;                    //r始终指向终端结点,开始时指向头结点  
  77.     for (i=0; i<n; i++)  
  78.     {  
  79.         s=(LinkList *)malloc(sizeof(LinkList));//创建新结点  
  80.         s->data=a[i];  
  81.         r->next=s;          //将*s插入*r之后  
  82.         r=s;  
  83.     }  
  84.     r->next=NULL;           //终端结点next域置为NULL  
  85. }  
  86.   
  87. void InitList(LinkList *&L)  
  88. {  
  89.     L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点  
  90.     L->next=NULL;  
  91. }  
  92. void DestroyList(LinkList *&L)  
  93. {  
  94.     LinkList *p=L,*q=p->next;  
  95.     while (q!=NULL)  
  96.     {  
  97.         free(p);  
  98.         p=q;  
  99.         q=p->next;  
  100.     }  
  101.     free(p);    //此时q为NULL,p指向尾结点,释放它  
  102. }  
  103. bool ListEmpty(LinkList *L)  
  104. {  
  105.     return(L->next==NULL);  
  106. }  
  107. int ListLength(LinkList *L)  
  108. {  
  109.     LinkList *p=L;  
  110.     int i=0;  
  111.     while (p->next!=NULL)  
  112.     {  
  113.         i++;  
  114.         p=p->next;  
  115.     }  
  116.     return(i);  
  117. }  
  118. void DispList(LinkList *L)  
  119. {  
  120.     LinkList *p=L->next;  
  121.     while (p!=NULL)  
  122.     {  
  123.         printf("%d ",p->data);  
  124.         p=p->next;  
  125.     }  
  126.     printf("\n");  
  127. }  
  128. bool GetElem(LinkList *L,int i,ElemType &e)  
  129. {  
  130.     int j=0;  
  131.     LinkList *p=L;  
  132.     while (j<i && p!=NULL)  
  133.     {  
  134.         j++;  
  135.         p=p->next;  
  136.     }  
  137.     if (p==NULL)            //不存在第i个数据结点  
  138.         return false;  
  139.     else                    //存在第i个数据结点  
  140.     {  
  141.         e=p->data;  
  142.         return true;  
  143.     }  
  144. }  
  145. int LocateElem(LinkList *L,ElemType e)  
  146. {  
  147.     LinkList *p=L->next;  
  148.     int n=1;  
  149.     while (p!=NULL && p->data!=e)  
  150.     {  
  151.         p=p->next;  
  152.         n++;  
  153.     }  
  154.     if (p==NULL)  
  155.         return(0);  
  156.     else  
  157.         return(n);  
  158. }  
  159. bool ListInsert(LinkList *&L,int i,ElemType e)  
  160. {  
  161.     int j=0;  
  162.     LinkList *p=L,*s;  
  163.     while (j<i-1 && p!=NULL) //查找第i-1个结点  
  164.     {  
  165.         j++;  
  166.         p=p->next;  
  167.     }  
  168.     if (p==NULL)    //未找到位序为i-1的结点  
  169.         return false;  
  170.     else            //找到位序为i-1的结点*p  
  171.     {  
  172.         s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s  
  173.         s->data=e;  
  174.         s->next=p->next;                        //将*s插入到*p之后  
  175.         p->next=s;  
  176.         return true;  
  177.     }  
  178. }  
  179. bool ListDelete(LinkList *&L,int i,ElemType &e)  
  180. {  
  181.     int j=0;  
  182.     LinkList *p=L,*q;  
  183.     while (j<i-1 && p!=NULL)    //查找第i-1个结点  
  184.     {  
  185.         j++;  
  186.         p=p->next;  
  187.     }  
  188.     if (p==NULL)                //未找到位序为i-1的结点  
  189.         return false;  
  190.     else                        //找到位序为i-1的结点*p  
  191.     {  
  192.         q=p->next;              //q指向要删除的结点  
  193.         if (q==NULL)  
  194.             return false;           //若不存在第i个结点,返回false  
  195.         e=q->data;  
  196.         p->next=q->next;        //从单链表中删除*q结点  
  197.         free(q);                //释放*q结点  
  198.         return true;  
  199.     }  
  200. }  
  201. int main()  
  202. {  
  203.     LinkList *L,*L1,*L2;  
  204.     int i;  
  205.     ElemType a[]= {1,2,3,4,5,6,7,8,9,10};  
  206.     InitList(L);  
  207.     InitList(L1);  
  208.     InitList(L2);  
  209.     for(i=9; i>=0; i--)  
  210.         ListInsert(L, 1, a[i]);  
  211.     printf("L:");  
  212.     DispList(L);  
  213.     printf("L->L1,L2\n");  
  214.     split(L,L1,L2);  
  215.     printf("L1:");  
  216.     DispList(L1);  
  217.     printf("L2:");  
  218.     DispList(L2);  
  219.     DestroyList(L1);  
  220.     DestroyList(L2);  
  221.     return 0;  
  222. }  


运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
以下是一个简单的单链表应用实例代码,使用C语言实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct Node { int data; struct Node* next; } node; // 创建新节点 node* create_node(int data) { node* new = (node*)malloc(sizeof(node)); new->data = data; new->next = NULL; return new; } // 在链表末尾插入节点 void insert_node(node** head, int data) { node* new = create_node(data); if (*head == NULL) { *head = new; return; } node* current = *head; while (current->next != NULL) { current = current->next; } current->next = new; } // 删除指定值的节点 void delete_node(node** head, int data) { if (*head == NULL) { return; } if ((*head)->data == data) { node* temp = *head; *head = (*head)->next; free(temp); return; } node* current = *head; while (current->next != NULL && current->next->data != data) { current = current->next; } if (current->next != NULL) { node* temp = current->next; current->next = current->next->next; free(temp); } } // 打印链表 void print_list(node* head) { printf("Linked List: "); while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } int main() { node* head = NULL; insert_node(&head, 1); insert_node(&head, 2); insert_node(&head, 3); insert_node(&head, 4); insert_node(&head, 5); print_list(head); delete_node(&head, 3); print_list(head); delete_node(&head, 1); print_list(head); return 0; } ``` 该代码实现了一个单链表的基本操作,包括创建节点、在末尾插入节点、删除指定值的节点和打印链表。可以通过在 `main` 函数中调用这些函数来使用这个单链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值