数据结构day4(2023.7.18)

一、Xmind整理:

链表的插入和删除:

二、课上练习:

练习1:顺序表去重

33  22  22  11   11 i    jfor(int i=0;i<list->len-1;i++){for(int j=i+1;j<len;j++){if(list->data[i]==list->data[j]){delete_by_sub(j,list);   j--;  //防止漏删        }        }   }

练习2: 顺序表合并

/** function:    顺序表有序合并* @param [ in] * @param [out] * @return      无*/
void combine(Seqlist *la,Seqlist *lb,Seqlist *lc)
{int p=0;//la的下表int q=0;//lb的下表while(p<la->len && q<lb->len){if(la->data[p] <=lb->data[q]){lc->data[lc->len++]=la->data[p++];}else{lc->data[lc->len++]=lb->data[q++];}}//吧la剩余元素存到lcwhile(p<la->len){lc->data[lc->len++]=la->data[p++];}//吧lb剩余元素存到lcwhile(q<lb->len){lc->data[lc->len++]=lb->data[q++];}}

练习3: 单链表创建

/** function:    创建一个节点* @param [ in] * @param [out] * @return      */
Linklist create_node()
{
Linklist node=(Linklist)malloc(sizeof(struct Node));if(NULL==node)return NULL;
node->data=0;
node->next=NULL;return node;//0x10
}

练习4:单链表头插0 

/** function:    头插* @param [ in] * @param [out] * @return      成功返回0 失败返回-1*/
Linklist insert_head(datatype e,Linklist L)
{//在堆区创建一个节点
Linklist node=create_node();
node->data=e;
node->next=L;L=node;return L;
}

练习5:单链表尾插 

/** function:    尾插* @param [ in] * @param [out] * @return      */
Linklist insert_rear(datatype e,Linklist L)
{//创建一个新节点
Linklist s=create_node();
s->data=e;if(L==NULL){L=s;}else{//rear指向最后一个节点的地址Linklist rear=L;while(rear->next!=NULL){rear=rear->next;}rear->next=s;}return L;
}

练习6: 单链表头删

/** function:    头删除* @param [ in] * @param [out] * @return      */
Linklist delete_head(Linklist L)
{//判断链表是否为空if(NULL==L){return L;}if(L->next==NULL){free(L);L=NULL;}else{Linklist q=L->next;L->data=q->data;L->next=q->next;free(q);q=NULL;}
return L;
}

练习7: 单链表尾删

/** function:    尾部删除* @param [ in] * @param [out] * @return      */
Linklist delete_rear(Linklist L)
{//1,判断链表是否为空if(NULL==L){return NULL;}//2,判断如果链表只有一个节点else if(L->next==NULL){free(L);L=NULL;}else{//3,有多个节点//循环倒数第二个节点Linklist second=L;while(second->next->next!=NULL){second=second->next;}free(second->next);second->next=NULL;}return L;
}

 练习8:单链表遍历

/** function:    循环遍历* @param [ in] * @param [out] * @return      成功返回0 失败返回-1*/
int output(Linklist L)
{//判断是否创建//判断是否为空if(NULL==L ){return -1;}while(L!=NULL){printf("%d\t",L->data);L=L->next;}puts("");
}

 练习9:单链表任意位置插入

int Len_linklist(Linklist L)
{int count=0;while(L!=NULL){count++;L=L->next;}return count;
}
/** function:    按位置插入* @param [ in] * @param [out] * @return      */
Linklist insert_by_pos(int pos,datatype e,Linklist L)
{//1,判断链表是否为空//2,判断位置是否合法int len;if(NULL==L || pos<1 || pos>(len=Len_linklist(L))+1){puts("insert arror");return L;}//3,插入
Linklist p=L;if(pos==len+1){insert_rear(e,L);return L;}for(int i=1;i<pos;i++){p=p->next;}//在p节点后面插入新节点s
Linklist s=create_node();
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;return L;
}

 三、课后作业:

1.顺序表排序

test.c核心代码:
/** function:    排序* @param [ in] * @param [out] * @return      */
int SeqlistSort(Seqlist *list)
{int i,j,count;datatype t;if(NULL==list||empty(list))return -1;for(i=1;i<list->len;i++){count=0;for(j=0;j<list->len-i;j++){if(list->data[j]>list->data[j+1]){t=list->data[j];list->data[j]=list->data[j+1];list->data[j+1]=t;count++;}}if(count==0)break;}return 0;
}

2.单链表任意位置删除 

/** function:    按链表位置删除* @param [ in] * @param [out] * @return      成功返回0 失败返回-1*/
Linklist delete_by_pos(int pos,Linklist L)
{//1,判断链表是否为空//2.判断位置是是否合法int len;if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1){puts("delete error\n");return L;}//3.找到pos-1位置起名pLinklist p=L;for(int i=0;i<pos-1;i++){p=p->next;}//4.删除p->nextLinklist q=p->next;p->next=q->next;free(q);q=NULL;return L;
}

3.单链表任意位置查找

/** function:    按链表位置查找* @param [ in] * @param [out] * @return      */
int search_by_data(datatype key,Linklist L)
{//1.判空int len=Len_linklist(L);if(NULL==L||key<1||key>(len=Len_linklist(L))+1){puts("search error\n");return -1;}Linklist p=L;for(int i=1;i<key;i++){p=p->next;}printf("%d\n",p->data);
}

 4.单链表任意位置修改

/** function:    按链表位置修改* @param [ in] * @param [out] * @return      */
Linklist update_by_pos(datatype key,datatype e,Linklist L)
{int len=Len_linklist(L);if(NULL==L||key<1||key>(len=Len_linklist(L))+1){puts("search error\n");return L;}Linklist p=L;for(int i=1;i<key;i++)p=p->next;p->data=e;return L;
}

整体代码如下: 

head.h:

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
//定义单链表节点结构体
typedef struct Node
{//数据域:数据元素datatype data;//指针域:存储下一个节点的地址struct Node *next;	
}*Linklist;
Linklist create_node();
Linklist insert_head(datatype e,Linklist L);
int output(Linklist L);
Linklist insert_rear(datatype e,Linklist L);
Linklist delete_head(Linklist L);
Linklist delete_rear(Linklist L);
int Len_linklist(Linklist L);
Linklist insert_by_pos(int pos,datatype e,Linklist L);
Linklist delete_by_pos(int pos,Linklist L);
int search_by_data(int key,Linklist L);
Linklist update_by_pos(datatype key,datatype e,Linklist L);#endif

test.c:

#include "head.h"
/** function:    创建一个节点* @param [ in] * @param [out] * @return      */
Linklist create_node()
{Linklist node=(Linklist)malloc(sizeof(struct Node));if(NULL==node)return NULL;node->data=0;node->next=NULL;return node;
}
/** function:    头插* @param [ in] * @param [out] * @return      成功返回0 失败返回-1*/
Linklist insert_head(datatype e,Linklist L)
{//在堆区创建一个节点Linklist node=create_node();//在堆区申请一个节点node->data=e;//数据域赋值为e//node节点链接到链表中node->next=L;L=node;return L;//因为自定义函数指针的改变不影响实参,需要返回
}
/** function:    循环遍历* @param [ in] * @param [out] * @return      */
int output(Linklist L)
{//判断是否创建//判断是否为空if(NULL==L){return -1;}while(L!=NULL){printf("%d\t",L->data);L=L->next;}printf("\n");
}
/** function:    尾部插入* @param [ in] * @param [out] * @return      */
Linklist insert_rear(datatype e,Linklist L)
{Linklist s=create_node();s->data=e;if(L==NULL){L=s;}else{Linklist rear=L;while(rear->next!=NULL){rear=rear->next;}rear->next=s;}return L;
}
/** function:    头删除* @param [ in] * @param [out] * @return      */
Linklist delete_head(Linklist L)
{//判断链表是否为空if(NULL==L){return L;}if(L->next==NULL){free(L);L=NULL;}else{Linklist q=L->next;L->data=q->data;L->next=q->next;free(q);q=NULL;}return L;
}
/** function:    尾部删除* @param [ in] * @param [out] * @return      */
Linklist delete_rear(Linklist L)
{//1.判断链表是否为空if(NULL==L){return NULL;}//2.判断如果链表只有一个节点else if(L->next==NULL){free(L);L=NULL;}else{//3.有多个节点//循环倒数第二个节点Linklist second=L;while(second->next->next!=NULL){second=second->next;}free(second->next);second->next=NULL;}return L;
}
/** function:    计算长度* @param [ in] * @param [out] * @return      */
int Len_linklist(Linklist L)
{int count=0;while(L!=NULL){count++;L=L->next;}return count;
}
/** function:    按链表位置插入* @param [ in] * @param [out] * @return      */
Linklist insert_by_pos(int pos,datatype e,Linklist L)
{//1.判断链表是否为空//2.判断位置是否合法int len;if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1){puts("insert error\n");return L;}//3.插入Linklist p=L;if(pos==len+1){insert_rear(e,L);return L;}for(int i=1;i<pos;i++){p=p->next;}//在p节点后面插入新节点s
Linklist s=create_node();
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return L;
}
/** function:    按链表位置删除* @param [ in] * @param [out] * @return      成功返回0 失败返回-1*/
Linklist delete_by_pos(int pos,Linklist L)
{//1,判断链表是否为空//2.判断位置是是否合法int len;if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1){puts("delete error\n");return L;}//3.找到pos-1位置起名pLinklist p=L;for(int i=0;i<pos-1;i++){p=p->next;}//4.删除p->nextLinklist q=p->next;p->next=q->next;free(q);q=NULL;return L;
}
/** function:    按链表位置查找* @param [ in] * @param [out] * @return      */
int search_by_data(datatype key,Linklist L)
{//1.判空int len=Len_linklist(L);if(NULL==L||key<1||key>(len=Len_linklist(L))+1){puts("search error\n");return -1;}Linklist p=L;for(int i=1;i<key;i++){p=p->next;}printf("%d\n",p->data);
}
/** function:    按链表位置修改* @param [ in] * @param [out] * @return      */
Linklist update_by_pos(datatype key,datatype e,Linklist L)
{int len=Len_linklist(L);if(NULL==L||key<1||key>(len=Len_linklist(L))+1){puts("search error\n");return L;}Linklist p=L;for(int i=1;i<key;i++)p=p->next;p->data=e;return L;
}

main.c:

#include "head.h"
int main(int argc, const char *argv[])
{Linklist L=NULL;int n;datatype e;printf("please enter n:");scanf("%d",&n);/*for(int i=0;i<n;i++){printf("please enter element:");scanf("%d",&e);//头插:在头指针当前节点插入L=insert_head(e,L);}*///在主函数找到尾部节点Linklist rear=L;if(rear!=NULL){while(rear->next!=NULL){rear=rear->next;}}//尾部插入for(int i=0;i<n;i++){printf("please enter element:");scanf("%d",&e);L=insert_rear(e,L);}//循环链表output(L);//头删//L=delete_head(L);//output(L);//尾删//L=delete_rear(L);//output(L);//按链表位置插入int pos;printf("please enter insert pos:");scanf("%d",&pos);printf("please enter insert element:");scanf("%d",&e);L=insert_by_pos(pos,e,L);output(L);//按链表位置删除printf("please enter delete pos:");scanf("%d",&pos);L=delete_by_pos(pos,L);output(L);//按链表位置查找datatype key;printf("please enter search key:");scanf("%d",&key);search_by_data(key,L);//按链表位置修改printf("please enter update pos:");scanf("%d",&key);printf("please enter update element:");scanf("%d",&e);update_by_pos(key,e,L);output(L);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC基础

有用的网址&#xff1a; https://webrtc.org/ WebRTC API - Web API 接口参考 | MDN Browser APIs and Protocols: WebRTC - High Performance Browser Networking(OReilly) 浏览器中查看webrtc运行的实时信息&#xff1a; Chrome浏览器&#xff1a;chrome://webrtc-inter…

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素&#xff0c;包括空值&#xff0c;任何元素&#xff0c;且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector&#xff0c;除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…

依赖注入三种方式,以及传统xml文件传参,还包括@Bean方式传参,还有Resource注入(详细版,每步都有提及)

获取bean对象&#xff0c;也称为对象装配&#xff0c;对象注入&#xff0c;依赖注入。 对象装配的实现方法有3种&#xff1a; 1.属性注入&#xff1b; 2.构造方法注入&#xff1b; 3.Setter注入。 再讲本节内容之前&#xff0c;我们先来提两个传参的方式&#xff0c;首先呢…

新手如何自学PostgreSQL(PG)

如果你是一个新手&#xff0c;想要自学PostgreSQL&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你入门&#xff1a; ①了解数据库基础知识&#xff1a;在开始学习PostgreSQL之前&#xff0c;建议你先了解一些数据库的基础概念和术语&#xff0c;例如表、列、行、SQL查…

什么是芯片组,南桥与北桥芯片的作用与区别

主板是连接计算机所有部件的PCB。在老式计算机中&#xff0c;所有芯片都分布在主板上。在现代计算机中&#xff0c;芯片数量减少并集中在特定位置。因此&#xff0c;将多个芯片组合起来形成一个芯片。这种可以替代大量芯片的芯片称为芯片组。主板上有一个芯片组。芯片组处理CPU…

echarts开发遇到的问题

echarts开发遇到的问题 1.rich富文本标签作为横向柱状图的刻度标签&#xff0c;其中带有icon。rich里不能写参数&#xff0c;只能写死&#xff1f;圆角设置无效&#xff1f; 解决办法&#xff1a; 自己写横向柱状图 散点图性能优化配置的临界点&#xff0c;最低优化数值必须…

day52

思维导图 比较指令结果的条件码 练习 汇编实现1-100的累加 .text .global _strat _start: mov r0,#0mov r1,#0 add_fun:add r0,r0,#1cmp r0,#100addls r1,r1,r0bls add_fun .end

微信小程序基于Promise封装发起网络请求

1.创建一个request.js // 相当于域名 const baseURL ***************; // 暴露一个request函数 export function request(parms) {// 路径拼接const url baseURL parms.url;// 请求体&#xff0c;默认为{}const data parms.data || {};// 请求方式&#xff0c;默认为GETco…

线性DP———最长公共子序列问题(LCS)

LCS问题 求两序列具有相同元素的最长子序列&#xff0c;我们可以用到动态规划的方法来解决问题 我们用 来表示序列 与序列 能组成的LCS的长度&#xff0c;的状态转移方程如下&#xff1a; 使用两层for循环就可以解决此问题&#xff0c;时间复杂度为,可以处理n<7000左右…

Windows 如何锁定文件

一、背景 如果应用程序有操作本地文件的功能&#xff08;如&#xff1a;读、写、复制、移动、删除等等&#xff09;&#xff0c;那么在测试或调试该应用程序时&#xff0c;肯定需要测试文件被其他应用程序锁定时&#xff0c;你的应用程序是如何处理的。 那么如何在本地模拟文件…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

二分类结局变量Logistic回归临床模型预测——分训练集和测试集(完结)

1. 介绍 2. 基线特征 3. 单因素多因素logistic回归分析及三线表 4. 构建临床列线图模型 5. 模型评价 6. 外部数据集验证 7. 另一种发文章的办法,分训练集和测试集,分析上述3-6节的内容 这里就讲一下如何分训练集和测试集,其余的步骤和之前是一样的,分训练集和测试集用…