作业1:单链表的按位置修改

思路:参数:L pos e

1,判断链表是否存在

2,判断链表是否为空

3,判断位置是否合法

4,找到pos起名字p

5. 修改p的数据域:重新赋值

作业2:单链表的按元素修改

思路:参数头结点L 被修改的元素key 要修改的元素e

1.根据key得到位置

2,根据位置修改

作业3:单链表的空间释放

循环删除头结点后面的所有结点

for(i=0;i

{

delete_head(L);

}

删除头

free(L)

L=NULL;

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;
typedef struct Node
{//数据域union{int len;//头结点的数据域:链表长度datatype data;//其他结点的数据域:数据元素};//指针域:下一个节点的地址struct Node *next;
}*linklist;
linklist create_head();int delete_pos(linklist L,int pos);
int insert_pos(linklist L,int pos,datatype e);
void output(linklist L);
int insert_head(linklist L,datatype e);
linklist create_node();int insert_rear(linklist L,datatype e);int delete_rear(linklist L);
int delete_head(linklist L);int search_pos(linklist L,int pos);int search_data(linklist L,datatype key);int update_pos(linklist L,int pos,datatype e);
int delete_data(linklist L,datatype key);void ifree(linklist L);
int datachange_data(linklist L,datatype num,datatype e);
#endif
#include "head.h"
/** function:    创建头结点* @param [ in] 无参数* @param [out] :w* @return      成功返回地址失败返回NULL*/
linklist create_head()
{//L是头结点:len next//struct Node: 是结点结构体的类型linklist L=(linklist)malloc(sizeof(struct Node));if(L==NULL)return NULL;L->len=0;//为单链表清空L->next=NULL;//防止头节点的指针域为野指针return L;}
/** function:    创建结点* @param [ in] 无参数* @param [out] * @return      成功返回地址失败返回NULL*/
linklist create_node()
{linklist p=(linklist)malloc(sizeof(struct Node));if(p==NULL)return NULL;p->data=0;p->next=NULL;return p;
}
/** function:    头插* @param [ in] 链表 插入的值* @param [out] * @return      成功返回0失败返回-1*/
int insert_head(linklist L,datatype e)
{//1,判断头结点是否存在if(L==NULL)return -1;//2,插入:在头结点后面linklist p=create_node();if(p==NULL)return -1;//3,连接//p的数据域p->data=e;//p的指针域p->next=L->next;L->next=p;L->len++;return 0;
}
/** function:    链表遍历* @param [ in] 头* @param [out] * @return      无返回*/
void output(linklist L)
{puts("");//1,判断头结点是否存在//2,判断链表是否为空if(L==NULL || L->len==0){printf("遍历失败\n");return;}
#if 0//3,遍历linklist p=L;for(int i=0;i<L->len;i++)//因为使用长度,所以头结点不能动{p=p->next;//后移一步printf("%d\t",p->data);}
#else//3,遍历while(L->next!=NULL)//while(L->next){L=L->next;printf("%d\t",L->data);}#endifputs("");
}
/** function:    单链表尾插* @param [ in] 头结点 插入的值* @param [out] * @return      成功返回0失败返回-1*/
int insert_rear(linklist L,datatype e)
{//1,判断头结点是否存在if(L==NULL){printf("插入失败\n");return -1;}//2,循环到最后一个结点linklist p=L;for(int i=0;i<L->len;i++){p=p->next;}//3,在p结点后面插入slinklist s=create_node();if(s==NULL)return -1;//s的数据域s->data=e;//链接p->next=s;L->len++;
}
/** function:    头删* @param [ in] 头结点* @param [out] * @return      成功返回0失败返回-1*/
int delete_head(linklist L)
{//1,判断头结点是否存在//2,判断链表是否为空if(L==NULL || L->len==0){printf("删除失败\n");return -1;}//3,删除头结点的后继结点linklist q=L->next;L->next=q->next;//连线free(q);q=NULL;L->len--;
}
/** function:    尾删* @param [ in] 头结点* @param [out] * @return      成功返回0失败返回-1*/
int delete_rear(linklist L)
{//1,判断头结点是否存在//2,判断链表是否为空if(L==NULL || L->len==0){printf("删除失败\n");return -1;}//3,循环移动到len-1位置linklist p=L;for(int i=0;i<L->len-1;i++){p=p->next;}//4,删除p->nextfree(p->next);p->next=NULL;//防止野指针L->len--;
}
/** function:    按位置插入* @param [ in] 头结点 插入的位置 插入的值* @param [out] * @return      成功返回0失败返回-1*/
int insert_pos(linklist L,int pos,datatype e)
{//1,判断头结点是否存在//2.判断位置是否合法if(L==NULL || pos<1 || pos>L->len+1){printf("插入失败\n");return -1;}//3,找到pos-1,起名字plinklist p=L;for(int i=0;i<pos-1;i++){p=p->next;}//4,插入新节点slinklist s=create_node();if(s==NULL)return -1;//s的数据域s->data=e;//s的指针域s->next=p->next;p->next=s;L->len++;
}
/** function:    按位置删除* @param [ in] 头结点  位置* @param [out] * @return      成功返回0失败返回-1*/
int delete_pos(linklist L,int pos)
{//1,判断头结点是否存在//2,判断链表是否为空//3,判断位置是否合法if(L==NULL || L->len==0 || pos<1 || pos>L->len){printf("删除失败\n");return -1;}//4,找到pos-1起名字plinklist p=L;for(int i=0;i<pos-1;i++){p=p->next;}//5,删除p->nextlinklist q=p->next;p->next=q->next;free(q);q=NULL;L->len--;
}
/** function:    按位置查找* @param [ in] 链表 位置* @param [out] * @return      成功返回0失败返回-1*/
int search_pos(linklist L,int pos)
{//1,判断头结点是否存在//2,判断链表是否为空//3,判断位置是否合法if(L==NULL || L->len==0 || pos<1 || pos>L->len){printf("查找失败\n");return -1;}//4,查找pos位置起名字plinklist p=L;for(int i=0;i<pos;i++){p=p->next;}//5,查找:输出printf("查找的值是:%d\n",p->data);return 0;
}
/** function:    按元素查找* @param [ in] 头结点 查找的值* @param [out] * @return      成功返回下表 失败返回-1*/
int search_data(linklist L,datatype key)
{//1,判断头结点是否存在//2,判断链表是否为空if(L==NULL || L->len==0){printf("按元素查找失败\n");return -1;}//3,循环链表比较linklist p=L;int count=0;while(p->next!=NULL){p=p->next;count++;if(p->data==key){return count;}}return -1;
}
/** function:    按元素删除* @param [ in] 头结点  删除的元素* @param [out] * @return      成功返回0失败返回-1*/
int delete_data(linklist L,datatype key)
{//1,查找key对应的位置int pos=search_data(L,key);if(pos==-1){printf("删除元素失败\n");return -1;}//2,根据位置删除delete_pos(L,pos);return 0;
}
/** function:    单链表按位置修改* @param [ in] 头结点 修改的位置 修改的值* @param [out] * @return    成功返回0失败返回-1    */
int update_pos(linklist L,int pos,datatype e)
{if(L==NULL || L->len==0 || pos<1 || pos>L->len){//1.判断链表是否存在//2.判断链表是否为空//3.判断链表是否合法printf("修改失败\n");return -1;}//4,查找pos位置起名字plinklist p=L;for(int i=0;i<pos;i++){p=p->next;}//5.重新赋值p->data=e;return 0;
/** function:    按元素对元素进行修改* @param [ in] 链表 修改的元素 新的元素* @param [out] * @return      成功返回0,失败返回-1*/
int datachange_data(linklist L,datatype num,datatype e)
{//判断元素是否存在//判断链表是否为空//判断头结点是否存在if(L==NULL||L->len==0){printf("修改失败!\n");return -1;}//首先找到要修改的元素的位置int index=search_data(L,num);insert_pos(L,index,e);}
/** function:    链表释放空间* @param [ in] 链表* @param [out]* @return      无返回值*/
void ifree(linklist L)
{if(L==NULL)return;for(int i=0;i<L->len;i++){delete_head(L);}//删除头ifree(L);L=NULL;
}}
#include "head.h"
int main(int argc, const char *argv[])
{linklist L=create_head();
#if 0//循环头插:在头结点就后面插入int n;datatype e;printf("请输入插入的个数:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入插入的值:");scanf("%d",&e);insert_head(L,e);}output(L);
#else//尾插:永远在尾部插入int n;datatype e;printf("请输入插入的个数:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入插入的值:");scanf("%d",&e);insert_rear(L,e);}output(L);
#endif
#if 0//头删:delete_head(L);delete_head(L);output(L);
#else//尾删
//  delete_rear(L);
//  delete_rear(L);output(L);
#endif//按位置插入int pos;printf("请输入插入的位置:");scanf("%d",&pos);printf("请输入插入的值:");scanf("%d",&e);insert_pos(L,pos,e);output(L);//按位置删除printf("请输入删除的位置:");scanf("%d",&pos);delete_pos(L,pos);output(L);//按位置查找printf("请输入查找的位置:");scanf("%d",&pos);search_pos(L,pos);//按元素查找datatype key;printf("请输入查找的值:");scanf("%d",&key);int flag=search_data(L,key);if(flag==-1)printf("查找的元素不存在\n");elseprintf("在%d位置出现\n",flag);//按元素删除printf("请输入删除的元素:");scanf("%d",&key);delete_data(L,key);output(L);//按位置修改printf("请输入查找的位置:");scanf("%d",&pos);printf("请输入插入要修改的值:");scanf("%d",&e);output(L);//按元素修改datatype num;printf("请输入要修改的元素:");scanf("%d",&num);printf("请输入新的元素:");scanf("%d",&e);datachange_data(L,num,e);output(L);puts("");//空间释放ifree(L);return 0;
}

20230330华清远见作业相关推荐

  1. 20230322华清远见作业

    作业1:定义有参函数实现,主调函数中输入两个数据,通过函数调用,交换该两个变量的值,主调函数输出交换后的结果 #include<stdio.h> #include<stdlib.h& ...

  2. 20230317华清远见作业

    作业1:输出从起始值到终止值之间,所有能被3或5整除的所有数,起始值和终止值由用户输入 #include<stdio.h> #include<string.h> #includ ...

  3. 20230319华清远见作业

    作业1:输出从起始值到终止值之间,所有能被3或5整除的所有数,起始值和终止值由用户输入 #include<string.h> #include<stdio.h> #includ ...

  4. 20230327华清远见作业

    1.在堆区申请2个字符类型的大小为20字节的空间. 1> 定义函数,实现在堆区申请空间 2> 定义函数,输入两个字符串 3> 定义函数,计算两个字符串的长度[非函数] sizeof_ ...

  5. 20230329华清远见作业

    #include "head.h"int main(int argc, const char *argv[]) {seqlist *list =create();//循环在尾部插入 ...

  6. 20230403华清远见作业

    1.进制转换 #ifndef __HEAD_H_ #define __HEAD_H_#include <stdio.h> #include <string.h> #includ ...

  7. 20230223华清远见作业

    仿照str系列函数,完成自定义的mystrlen .mystrcmp.mystrcpy,mystrcat. mystrlen #include<stdio.h> #include<s ...

  8. 20230331华清远见作业

    #include "head.h" int main(int argc, const char *argv[]) {doublelink l =create_head();int ...

  9. 阶段总结:华清远见毕业总结

    在毕业之际,苦于自身水平不足,不够完善的技能不足以在就业形势严峻的今天找到一份适合的工作,由于我是一个电子信息工程专业出身的学生,在学校里通过专业选修等课程接触到了单片机和嵌入式等课程,从而产生了一点 ...

最新文章

  1. java JDK 11.0.5的安装
  2. 物联网 — 5G 边缘计算与 IoT
  3. mysql 5.6.11 error 1059_mysql5.6.15问题如何解决
  4. nacos作注册中心+feign接口调用进行服务提供和服务消费代码示例
  5. 详解struts2中struts.properties
  6. ECMAScript 2019(ES10)新特性简介
  7. js符号输入不可用_JS 控制非法字符的输入代码
  8. 天津知青网6周年网庆-京剧-智取威虎山片段
  9. [转]Java5泛型的用法,T.class的获取和为擦拭法站台
  10. c++date数据类型_PLC编程设涉及到的数据类型了解一下
  11. file对象怎么才会有值_怎么去聊天女生才会跟你约会
  12. linux下rocksdb的编译安装
  13. 浅谈MySQL索引背后的数据结构及算法
  14. T4 生成指定DB表实体
  15. PLSQL的下载、安装、配置远程连接Oracle 详解
  16. 判断用户首次登录的两种方式
  17. 互联网的起源发展历史
  18. JavaScript-- 基础知识面试题
  19. php 商户转账到微信零钱
  20. 数字IC手撕代码-兆易创新笔试真题

热门文章

  1. 【Graphics·二】带反射和折射的Fresnel函数
  2. 十、Spring Boot 安全管理(2)
  3. Vulnhub-OSCP
  4. 2.3 组合框(Combo Box)和列表框(List Box)使用实例
  5. html设置盒子水平垂直居中,盒子水平垂直居中10种方法
  6. Vue.js引入echarts、elementUI、museUI、mintUI
  7. ubuntu中非常好用的文件比较工具meld
  8. 水果店朋友圈文案怎么写,水果店油桃朋友圈文案
  9. vue采用 XLSX文件上传与下载
  10. 谷粒商城-11-p248-p299