ci获取当前控制器,当前方法,增删改查

本文介绍了一个使用 CodeIgniter 框架实现的增删改查(CRUD)功能示例,包括控制器、模型和视图的具体实现方式,以及如何通过表单提交数据到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在core里新建MY_controller

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Controller extends CI_Controller{
   public function __construct(){
      parent::__construct();
   
      echo "你当前的控制器:"."<font style='color:red'>".$this->router->class."</font>";
      echo "<br>";
      echo "你当前的方法:"."<font style='color:red'>".$this->router->method."</font>";
      }
      
 
}

?>

C层
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Index extends MY_Controller {

        /*
          构造方法
      */
      public function __construct(){
         parent::__construct();                         
         } 

   /**
    * Index Page for this controller.
    *
    * Maps to the following URL
    *        http://example.com/index.php/welcome
    * - or -
    *        http://example.com/index.php/welcome/index
    * - or -
    * Since this controller is set as the default controller in
    * config/routes.php, it's displayed at http://example.com/
    *
    * So any other public methods not prefixed with an underscore will
    * map to /index.php/welcome/<method_name>
    * @see https://codeigniter.com/user_guide/general/urls.html
    */
   /**显示表单
    * [index description]
    * @return [type] [description]
    */
   public function index()
   {
      $this->load->view('Index/wel.html');
   }
   /**
    * 添加方法
    * 
    */
   public function add_pro(){
      $data=array(
         'names'=>$this->input->post('names'),
         'url'=>$this->input->post('url'),
         'tell'=>$this->input->post('tell'),
         'show'=>$this->input->post('show'),
         'sort'=>$this->input->post('sort')
         );
      $res=$this->db->insert('ci0509',$data);
      if($res){
         redirect('Index/show');
      }else{
         echo "添加失败";
      }
   }
   /**
    * 显示列表
    */
   public function show(){
      $sql="select * from ci0509";
      //var_dump($sql);
      $res=$this->db->query($sql);
      $list=$res->result_array();
      //var_dump($list);
      $data['list']=$list;
      $this->load->view('Index/show_list.html',$data);
   }
   /**
    * 删除
    */
   public function del(){
      $id=$this->input->get('id');
      $res=$this->db->delete('ci0509',array('id'=>$id));
      if($res){
         redirect('Index/show');
      }else{
         echo "删除失败";
      }
   }
   /**
    * 修改
    */
   public function update(){
      $id=$this->input->get('id');
      $list=$this->db->get_where('ci0509',array('id'=>$id))->result_array();
      $data['list']=$list;
      $this->load->view('Index/updates.html',$data);
   }
   /**
    * 执行修改
    */
    function update_pro(){
      $id=$this->input->post('id');
     $data=array(
         'names'=>$this->input->post('names'),
         'url'=>$this->input->post('url'),
         'tell'=>$this->input->post('tell'),
         'show'=>$this->input->post('show'),
         'sort'=>$this->input->post('sort')
         ); 
            $this->db->where('id',$id);
         
         if($this->db->update('ci0509',$data)){
            redirect('Index/show');
         }else{
            echo "修改失败";

         }

   }
   
}
视图show

 
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Document</title>
</head>
<body>
<table border="1">
   <tr>
      <td>编号</td>
      <td>商品名称</td>
      <td>商品网址</td>
      <td>商品描述</td>
      <td>是否显示</td>
      <td>排序</td>
      <td>操作</td>
   </tr>
   <?php foreach($list as $v){?>
   <tr>
      <td><?php echo $v['id'];?></td>
      <td><?php echo $v['names'];?></td>
      <td><?php echo $v['url'];?></td>
      <td><?php echo $v['tell'];?></td>
      <td><?php if($v['show']==1){
         echo "√";
         }else{
         echo "×";
            }?></td>
      <td><?php echo $v['sort'];?></td>
      <td><a href="<?php echo site_url('Index/del?id='.$v['id']) ?>">删除</a>||<a href="<?php echo site_url('Index/update?id='.$v['id'])?>">修改</a></td>
   </tr>
   <?php  } ?>
</table>
   
</body>
</html>
视图update
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>表单页面</title>
</head>
<body>
<?php foreach($list as $v){ ?>
  <form action="<?php echo site_url('Index/update_pro'); ?>" method="post">

<input type="hidden" name="id" value='<?php echo $v['id'] ?>'  >
   <table>
      <tr>
          <td>商品名称</td>
         <td><input type="text" name="names"value="<?php echo $v['names'] ?>"></td>
      </tr>

      <tr>
          <td>品牌网址</td>
         <td><input type="text" name="url" value="<?php echo $v['url'] ?>"></td>
      </tr>
      <tr>
          <td>品牌描述</td>
         <td><textarea name="tell"  cols="30" rows="10"><?php echo $v['tell'] ?></textarea></td>
      </tr>
      <tr>
          <td>是否显示</td>
         <td><input type="radio" name="show" value="1" <?php if($v['show']==1){
          echo "checked";
          }  ?>/>显示
            <input type="radio" name="show" value="0"<?php if($v['show']==0){
          echo "checked";}  ?>/>不显示
         </td>
      </tr>
      <tr>
          <td>排序</td>
         <td><input type="text" name="sort" value="<?php echo $v['sort'] ?>">
         </td>
      </tr>
      <tr>
         <td></td>
         <td><input type="submit" value="修改"></td>
      </tr>
      
   </table>
    
  </form>
   <?php } ?>
</body>
</html>
视图wel
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>表单页面</title>
</head>
<body>
  <form action="<?php echo site_url('index/add_pro'); ?>" method="post">
   <table>
      <tr>
          <td>商品名称</td>
         <td><input type="text" name="names"></td>
      </tr>
      <tr>
          <td>品牌网址</td>
         <td><input type="text" name="url"></td>
      </tr>
      <tr>
          <td>品牌描述</td>
         <td><textarea name="tell"  cols="30" rows="10"></textarea></td>
      </tr>
      <tr>
          <td>是否显示</td>
         <td><input type="radio" name="show" value="1" >显示
            <input type="radio" name="show" value="0">不显示
         </td>
      </tr>
      <tr>
          <td>排序</td>
         <td><input type="text" name="sort">
         </td>
      </tr>
      <tr>
         <td></td>
         <td><input type="submit" value="添加"></td>
      </tr>
      
   </table>
  </form>
   
</body>
</html>




 

<think>首先,用户的问题是根据给定的引用内容,查找关于C语言实现静态链表的增删改查的操作方法或代码示例。用户指定的关键词是“C语言静态链表增删改查实现示例”。回顾系统级指令:-所有行内数学表达式使用$...$。-独立公式使用$$...$$。-确保LaTeX语法正确。-使用中文回答。-生成相关问题。-引用的段落末尾添加引用标识。用户提供了几个引用:-引用[1]:关于顺序表的静态存储定义。-引用[2]:关于数据结构的理论和线性表,包括动态数组和链表的完整代码。-引用[3]:关于Scratch和C语言实现静态链表的建立及操作,包括初始化、添加数据、删除数据等。-引用[4]:关于动态顺序表的增删改查方法。-引用[5]:关于C语言基于链表实现简单的学生管理系统。用户的问题聚焦在静态链表上,所以引用[3]是最相关的,因为它专门讨论了静态链表。引用[3]描述:-Scratch和C语言实现静态链表的建立及操作。-数据结构:对于没有指针的语言,用数组替代指针,描述链表。-元素由data和cur组成,cur相当于next指针。-第一个元素cur存放备用元素的下标,最后一个元素cur存放第一个有值元素的下标。-操作包括初始化、添加数据、删除数据、回收空闲节点等。用户需要增删改查的实现示例,所以我应该从引用[3]中提取相关信息。回答结构:-要清晰,帮助用户逐步解决问题。-使用中文。-在引用的段落末尾添加引用标识如[^3]。步骤:1.介绍静态链表的基本概念,参考引用[3]。2.给出静态链表的C语言定义和初始化代码。3.分别提供增(添加数据)、删(删除数据)、改(修改数据)、查(查找数据)的代码示例。4.确保代码基于引用[3]。5.结束时生成相关问题。从引用[3]:-它提到了C语言实现静态链表,包括建立和操作。-操作包括添加数据、删除数据、回收空闲节点。-但没有完整代码,我需要基于描述来构建示例代码,类似用户提供的其他引用如引用[4]有代码示例。引用[3]说:"C语言实现静态链表",并描述了元素结构:data和cur,第一个和最后一个元素特殊处理。-它给出了操作的部分代码,但用户信息中只有描述,没有完整代码。我需要推断或基于描述编写简单示例。例如:-元素结构:structNode{intdata;intnext;};(但引用中是data和cur,cur是下一个元素的索引)-参考描述:元素由data和cur两部分组成,cur相当于next指针。-数组描述:比如Nodearray[MAX_SIZE];-第一个元素array[0]的cur存放备用元素的第一个下标(即空闲列表的头)。-最后一个元素(假设是array[MAX_SIZE-1])cur存放第一个有值元素的下标。在代码中,实现:-初始化-添加数据(插入)-删除数据-查找数据-修改数据(可能通过查找后修改)增删改查:-增:插入数据-删:删除数据-改:修改数据-查:查找数据基于引用[3],我可以提供一个简单的C语言代码示例。由于引用[4]提供了动态顺序表的完整示例,我可以用类似风格,但适配静态链表。生成相关问题:-像系统指令所说,结束时添加相关问题。回答结构:1.**介绍静态链表**:解释概念,基于引用[3]。2.**代码实现**:-定义结构-初始化函数-增(插入)操作-删(删除)操作-查(查找)操作-改(修改)操作3.**完整示例代码**:提供一个简单的静态链表实现示例。4.**相关问题**。确保在引用的地方添加标识:例如,当提到引用[3]时,用[^3]结束。数学表达式:用户问题中没有数学内容,所以可能不需要$...$或$$...$$,但如果有方程,就用。现在,构建代码。回忆引用[3]:-用数组描述的链表。-每个元素:data和cur。-第一个元素:存放第一个备用元素下标。-最后一个元素:存放第一个有值元素下标。定义一个静态链表:假设MAX_SIZE是数组大小。定义结构:typedefstructStaticNode{intdata;//数据部分intnext;//下一个元素的索引(cur)}StaticNode;但引用中说是游标实现法,且前两个元素特殊处理。引用[3]:"我们对数组的第一个和最后一个元素做特殊处理...让数组的第一个元素cur存放第一个备用元素下标,而数组的最后一个元素cur存放第一个有值元素下标"所以,数组索引从1到MAX_SIZE-2用于存数据?不,所有元素都是数组的一部分。标准方式:-数组元素0:头结点,next指向空闲列表头。-数组元素1到MAX_SIZE-2:可能用于数据存储。-数组元素MAX_SIZE-1:头结点,next指向数据列表头。常见实现中:-索引0是备用列表头。-索引MAX_SIZE-1是使用列表头。例如:-定义一个structNode{intdata;intnext;}list[MAX_SIZE];-list[0].next指向第一个空闲节点索引。-list[MAX_SIZE-1].next指向第一个数据节点索引。初始化时,所有节点都在空闲列表。代码示例:首先,包含头文件和定义:#include<stdio.h>#defineMAX_SIZE100typedefstructStaticNode{intdata;intnext;}StaticNode;StaticNodelist[MAX_SIZE];voidinitStaticList(){//初始化所有节点为空闲list[0].next=1;//空闲列表头指向第一个节点list[MAX_SIZE-1].next=0;//使用列表头为空,但引用中是最后一个元素是头结点参考引用[3]:"数组的第一个元素cur存放第一个备用元素下标",假设数组索引从0开始:-索引0:备用列表头-索引MAX_SIZE-1:使用列表头(引用中说最后一个元素cur存放第一个有值元素下标)所以:-list[0].next指向第一个备用索引-list[MAX_SIZE-1].next指向第一个使用索引初始化:for(inti=1;i< MAX_SIZE-1;i++){list[i].next=i+1;//链式空闲列表}list[MAX_SIZE-2].next=0;//最后一个节点指向0表示结束list[0].next=1;//备用头指向第一个空闲节点list[MAX_SIZE-1].next=0;//使用头初始化为空索引从0到MAX_SIZE-1。简化MAX_SIZE定义。对于操作:-添加数据:从备用列表取一个节点,插入到使用列表。-删除数据:从使用列表移除,添加到备用列表。-查找数据:遍历使用列表。-修改数据:查找后修改。参考引用[4]有动态顺序表的代码风格,我可以类似。给出代码。然后生成相关问题:1.静态链表和动态链表的优缺点比较?2.如何回收空闲节点?3.静态链表在内存受限环境下的应用?确保回答在中文。</think> 以下是基于您的查询,关于C语言实现静态链表增删改查的操作方法和代码示例的详细回答。我主要参考了您提供的引用[^3],其中描述了静态链表的概念和基本操作:静态链表是一种用数组模拟链表的数据结构,每个元素由`data`(数据)和`cur`(游标,相当于指针)组成,数组的第一个元素(索引0)用于管理空闲节点,最后一个元素(索引MAX_SIZE-1)作为头节点指向数据链表的起始位置[^3]。其他引用(如[^1]、[^2]、[^4]、[^5])涉及顺序表或动态链表,但您的重点是静态链表,因此我将专注于引用[^3]提供核心内容。 回答结构清晰分步: 1. **静态链表概念解释**:简述什么是静态链表及其优势。 2. **代码实现**:提供完整的C语言代码示例,包括结构定义、初始化和增删改查操作。 3. **操作说明**:分步解释每个功能的原理和代码逻辑。 4. **相关引用应用**:在关键描述后添加引用标识。 5. **相关问题**:结尾生成与主题相关的探索性问题。 ### 1. 静态链表概念解释 静态链表使用数组模拟链表结构,适用于不支持指针的编程语言(如C语言的底层实现)。每个数组元素包含两部分: - `data`:存储实际数据。 - `cur`:存储下一个元素的索引(相当于指针),形成链式结构。 第一个数组元素(索引0)的`cur`指向空闲节点的起始位置(备用列表),最后一个元素(索引MAX_SIZE-1)的`cur`指向数据链表的第一个节点(头节点)[^3]。优势是内存固定、无动态分配开销,适合嵌入式系统或固定大小存储场景。 ### 2. C语言实现静态链表增删改查示例代码 下面是一个完整的C语言代码示例,包括初始化、插入(增)、删除(删)、查找(查)、修改(改)操作。我基于引用[^3]的描述实现: - **数组结构**:定义一个`StaticNode`数组,大小为`MAX_SIZE`。 - **空闲节点管理**:使用索引0管理空闲链,通过`cur`字段连接空闲节点。 - **数据链表管理**:使用索引MAX_SIZE-1作为头节点,指向数据链表的第一个元素。 - **增删改查逻辑**: - 插入:从空闲链获取节点,插入到数据链表指定位置。 - 删除:从数据链表移除节点,将其回收到空闲链。 - 查找:遍历数据链表查找数据。 - 修改:结合查找和赋值操作。 完整代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_SIZE 100 // 定义静态链表最大大小 // 定义静态链表节点结构:每个节点包含数据(data)和游标(cur) typedef struct StaticNode { int data; // 数据域 int cur; // 游标,指向下一个节点的索引 } StaticNode; // 静态链表数组:索引0用于空闲链表管理,索引MAX_SIZE-1用于数据链表头 StaticNode staticList[MAX_SIZE]; // 初始化静态链表:将所有节点初始化为空闲状态 void initStaticList() { // 第一个节点(索引0)管理空闲链表: cur指向第一个空闲节点的索引 staticList[0].cur = 1; // 空闲链表起始索引为1 // 最后一个节点(索引MAX_SIZE-1)管理数据链表: cur为0表示数据链表初始为空 staticList[MAX_SIZE - 1].cur = 0; // 初始化其他节点为空闲链:每个节点的cur指向下一个空闲索引 for (int i = 1; i < MAX_SIZE - 1; i++) { staticList[i].cur = i + 1; } staticList[MAX_SIZE - 2].cur = 0; // 最后一个空闲节点指向0结束链[^3] } // 插入数据(增):在数据链表指定位置插入元素,返回插入位置索引 int insertData(int value, int position) { if (staticList[0].cur == 0) { printf("Error: No free space available!\n"); return -1; // 空间满,插入失败 } // 获取空闲节点(从空闲链表头) int freeIndex = staticList[0].cur; staticList[0].cur = staticList[freeIndex].cur; // 更新空闲链表头 staticList[freeIndex].data = value; // 设置数据 // 遍历数据链表到指定位置 int prev = MAX_SIZE - 1; // 从数据链表头开始 int current = staticList[MAX_SIZE - 1].cur; for (int i = 0; i < position && current != 0; i++) { prev = current; current = staticList[current].cur; } // 插入节点 staticList[prev].cur = freeIndex; // 前节点指向新节点 staticList[freeIndex].cur = current; // 新节点指向原当前位置 return freeIndex; // 返回插入位置索引 } // 删除数据(删):移除数据链表指定位置的节点,并回收 void deleteData(int position) { if (staticList[MAX_SIZE - 1].cur == 0) { printf("Error: Data list is empty!\n"); return; } // 遍历到指定位置 int prev = MAX_SIZE - 1; int current = staticList[MAX_SIZE - 1].cur; for (int i = 0; i < position && current != 0; i++) { prev = current; current = staticList[current].cur; } if (current == 0) { printf("Error: Position out of range!\n"); return; } // 移除节点并回收 staticList[prev].cur = staticList[current].cur; // 跳过当前节点 staticList[current].cur = staticList[0].cur; // 回收:当前节点指向空闲链表 staticList[0].cur = current; // 空闲链表头指向回收节点[^3] } // 查找数据(查):查找数据值,返回节点索引 int findData(int value) { int current = staticList[MAX_SIZE - 1].cur; // 从数据链表头开始 while (current != 0) { if (staticList[current].data == value) { return current; // 找到返回索引 } current = staticList[current].cur; } return -1; // 未找到 } // 修改数据(改):查找节点索引并更新数据 void modifyData(int oldValue, int newValue) { int index = findData(oldValue); if (index != -1) { staticList[index].data = newValue; // 直接修改数据 printf("Data modified successfully at index %d\n", index); } else { printf("Error: Data not found for modification!\n"); } } // 打印数据链表:调试用 void printDataList() { int current = staticList[MAX_SIZE - 1].cur; printf("Data List: "); while (current != 0) { printf("%d -> ", staticList[current].data); current = staticList[current].cur; } printf("End\n"); } int main() { initStaticList(); // 初始化链表 // 测试增删改查操作 insertData(10, 0); // 在位置0插入10 insertData(20, 1); // 在位置1插入20 insertData(30, 0); // 在位置0插入30(头插) printDataList(); // 输出: Data List: 30 -> 10 -> 20 -> End int foundIndex = findData(10); if (foundIndex != -1) { printf("Found data 10 at index %d\n", foundIndex); } modifyData(10, 100); // 修改10为100 printDataList(); // 输出: Data List: 30 -> 100 -> 20 -> End deleteData(1); // 删除位置1(对应100) printDataList(); // 输出: Data List: 30 -> 20 -> End return 0; } ``` ### 3. 操作说明(分步解释) 参考代码中的函数,实现增删改查的原理: - **初始化**:`initStaticList()` 设置数组所有节点:索引0指向第一个空闲节点(如索引1),空闲节点成链;索引MAX_SIZE-1指向0表示空数据链表[^3]。 - **插入数据(增)**:从空闲链表头取出节点(`staticList[0].cur`),赋值后插入数据链表。插入需要遍历找到指定位置,然后更新游标连接新节点。 - **删除数据(删)**:找到数据链表中的节点,移除后将其游标指向空闲链表头,并更新空闲链表头为回收节点索引(实现回收)[^3]。 - **查找数据(查)**:遍历数据链表(从索引MAX_SIZE-1开始),依次比对数据值,返回索引或-1。 - **修改数据(改)**:先调用`findData`查找位置,然后直接修改`data`字段。 优势:静态链表避免了动态内存分配的开销,但大小固定;适用于内存资源受限的场景,如微控制器系统(引用[^3]描述的“游标实现法”)[^3]。 ### 4. 相关问题 基于C语言静态链表的实现,以下是相关探索性问题,帮助深入理解: 1. **静态链表和动态链表在内存使用上的区别是什么?各自的优缺点是什么?** 2. **如何在静态链表中实现空闲节点的高效回收(如避免 fragmentation)?参考引用[^3],是否有优化策略?** 3. **静态链表在嵌入式系统或实时应用中的典型场景有哪些?** 4. **如何扩展静态链表以支持更复杂的数据类型(如结构体而非int)?** 5. **比较静态链表与引用[^4]中的动态顺序表:在增删效率和应用场景上的差异。** 如果这些回答解决了您的疑问,或需要更多代码优化细节,请随时追问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值