algo2-3.c

 /* algo2-5.c 实现算法2.11、2.12的程序 */
 #include"c1.h"
 typedef int ElemType;
 #include"c2-2.h"
 #include"bo2-2.c"
 #include"func2-3.c" /* 包括equal()、comp()、print()、print2()和print1()函数 */

 void CreateList(LinkList *L,int n) /* 算法2.11 */
 { /* 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L */
   int i;
   LinkList p;
   *L=(LinkList)malloc(sizeof(struct LNode));
   (*L)->next=NULL; /* 先建立一个带头结点的单链表 */
   printf("请输入%d个数据\n",n);
   for(i=n;i>0;--i)
   {
     p=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
     scanf("%d",&p->data); /* 输入元素值 */
     p->next=(*L)->next; /* 插入到表头 */
     (*L)->next=p;
   }
 }

 void CreateList2(LinkList *L,int n)
 { /* 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表L */
   int i;
   LinkList p,q;
   *L=(LinkList)malloc(sizeof(struct LNode)); /* 生成头结点 */
   (*L)->next=NULL;
   q=*L;
   printf("请输入%d个数据\n",n);
   for(i=1;i<=n;i++)
   {
     p=(LinkList)malloc(sizeof(struct LNode));
     scanf("%d",&p->data);
     q->next=p;
     q=q->next;  //q从新指向尾结点。理解的还不是很透彻 if 改为p==q??

   }  

 p->next=NULL;
 }

 void MergeList(LinkList La,LinkList *Lb,LinkList *Lc) /* 算法2.12 */
 { /* 已知单链线性表La和Lb的元素按值非递减排列。 */
   /* 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列 */
   LinkList pa=La->next,pb=(*Lb)->next,pc;
   *Lc=pc=La; /* 用La的头结点作为Lc的头结点 */
   while(pa&&pb)
     if(pa->data<=pb->data)
     {
       pc->next=pa;
       pc=pa;
       pa=pa->next;
     }
     else
     {
       pc->next=pb;
       pc=pb;
       pb=pb->next;
     }
   pc->next=pa?pa:pb; /* 插入剩余段 */?????
   free(*Lb); /* 释放Lb的头结点 */
   Lb=NULL;
 }

 void main()
 {
   int n=5;
   LinkList La,Lb,Lc;
   printf("按非递减顺序, ");
   CreateList2(&La,n); /* 正位序输入n个元素的值 */
   printf("La="); /* 输出链表La的内容 */
   ListTraverse(La,print);
   printf("按非递增顺序, ");
   CreateList(&Lb,n); /* 逆位序输入n个元素的值 */
   printf("Lb="); /* 输出链表Lb的内容 */
   ListTraverse(Lb,print);
   MergeList(La,&Lb,&Lc); /* 按非递减顺序归并La和Lb,得到新表Lc */
   printf("Lc="); /* 输出链表Lc的内容 */
   ListTraverse(Lc,print);
 }

 

 

<think> 我们之前已经讨论过如何解决该问题,现在用户再次遇到同样的问题(内核版本6.8.0-87-generic),需要重新安装PCAN USB驱动。根据之前的解决方案,核心步骤是安装内核头文件并重新编译驱动。由于内核版本已变,必须针对新内核重新编译。 但是,用户提供的引用[1]提到的是另一个内核版本(6.8.0-60-generic),说明用户可能在内核升级后遇到了同样的问题。因此,我们需要确保针对当前内核(6.8.0-87-generic)进行操作。 步骤: 1. 确认当前内核版本和头文件是否安装 2. 重新编译驱动(注意驱动源代码路径) 3. 处理模块签名(如果Secure Boot开启) 4. 加载模块 注意:用户当前工作目录为:/home/zhm/Downloads/peak-linux-driver-8.20.0.tar.gz/peak-linux-driver-8.20.0,说明驱动源码已经解压。 具体步骤: </think> ### 解决 Linux 内核 6.8.0-87-generic 中 `pcan_usb` 模块加载失败的问题 #### 问题分析 当执行 `modprobe pcan_usb` 出现 `Module not found` 错误时,表明系统存在以下问题: 1. **内核模块未编译**:驱动未针对当前内核版本(6.8.0-87-generic)编译 2. **内核开发包缺失**:缺少编译所需的内核头文件 3. **模块路径错误**:驱动未安装到 `/lib/modules/$(uname -r)/` 目录 4. **Secure Boot 阻止**:Ubuntu 的 Secure Boot 会阻止未签名模块加载 --- ### 完整解决方案 #### 步骤 1:安装内核开发包 ```bash # 安装匹配当前内核的开发包 sudo apt update sudo apt install linux-headers-$(uname -r) build-essential libelf-dev ``` ✅ 验证安装: `ls /usr/src/linux-headers-$(uname -r)` 应显示内核头文件 #### 步骤 2:重新编译驱动 ```bash # 进入驱动目录 cd /home/zhm/Downloads/peak-linux-driver-8.20.0 # 清理旧编译 sudo make clean # 指定内核路径编译 sudo make KERNEL_PATH=/lib/modules/$(uname -r)/build # 安装驱动 sudo make install ``` #### 步骤 3:更新模块依赖 ```bash # 重建模块依赖关系 sudo depmod -a # 验证模块路径 modinfo pcan_usb | grep filename ``` ✅ 预期输出: `filename: /lib/modules/6.8.0-87-generic/.../pcan_usb.ko` #### 步骤 4:解决 Secure Boot 问题 ```bash # 检查 Secure Boot 状态 mokutil --sb-state # 若返回 "SecureBoot enabled",需执行: # 方法 1:临时禁用验证(重启后生效) sudo mokutil --disable-validation # 方法 2:为模块签名(推荐) sudo apt install shim-signed sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \ /var/lib/shim-signed/mok/MOK.priv \ /var/lib/shim-signed/mok/MOK.der \ $(modinfo -n pcan_usb) ``` #### 步骤 5:加载驱动 ```bash # 加载核心模块 sudo modprobe pcan # 加载 USB 子模块 sudo modprobe pcan_usb # 验证加载状态 lsmod | grep -E &#39;pcan|pcan_usb&#39; dmesg | grep -i pcan ``` ✅ 成功标志: - `lsmod` 显示 `pcan_usb` 和 `pcan` 模块 - `dmesg` 显示 `pcan: driver initialized`[^1] --- ### 故障排查流程图 ```mermaid graph TD A[模块未找到] --> B{检查 /lib/modules/$(uname -r)} B -->|模块存在| C[Secure Boot 问题] B -->|模块缺失| D[重新编译驱动] C --> E[禁用 Secure Boot 或签名] D --> F[安装内核头文件] F --> G[执行 make install] G --> H[运行 depmod -a] H --> I[成功加载] ``` ### 常见问题处理 1. **编译错误**: ```bash # 修复 Makefile 配置 sudo make KERNEL_PATH=/lib/modules/$(uname -r)/build PCI=NO PAR=NO ISA=NO ``` 2. **驱动版本不兼容**: ```bash # 下载最新驱动 wget https://www.peak-system.com/fileadmin/media/linux/files/peak-linux-driver-8.20.0.tar.gz tar -xvf peak-linux-driver-8.20.0.tar.gz ``` 3. **内核升级后失效**: ```bash # 创建自动编译脚本 echo &#39;#!/bin/sh sudo apt install linux-headers-$(uname -r) cd /opt/peak-driver && sudo make clean && sudo make install&#39; | sudo tee /etc/kernel/postinst.d/pcan-driver sudo chmod +x /etc/kernel/postinst.d/pcan-driver ``` > 提示:查看详细编译日志: > `tail -f /home/zhm/Downloads/peak-linux-driver-8.20.0/driver/Makefile.log`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值