C语言链表删除结点:mydel函数实现

本文将介绍如何使用C语言实现一个名为mydel的函数,用于从一个无头结点的链表中删除指定name域的结点。函数接收链表的头指针和目标name值,并返回删除后的链表头指针。

1. 链表结构定义

首先,定义一个简单的链表结构,包含nameno和指向下一个结点的指针next

struct stu{
  char name[20];
  int no;
  struct stu *next;
};

2. 函数接口定义

函数mydel的接口定义如下:

struct stu * mydel(struct stu *head,char *name);

其中:

  • head: 已经创建好的无头结点的链表的头指针。
  • name: 最大为19个字符的字符串,用于标识要删除的结点的name域。

3. 函数实现

函数mydel的实现代码如下:

struct stu * mydel(struct stu *head,char *name){
  struct stu *p,*q;
  p=head;
  if(strcmp(p->name,name)==0){  //头结点就是需要删除的节点
    head=head->next;
    free(p);
    return head;
  }
  while(p->next!=NULL&&strcmp(p->next->name,name)!=0){  //查找需要删除的节点
    p=p->next;
  }
  if(p->next==NULL){  //没找到
    printf('no found\n');
    return head;
  }
  q=p->next;  //找到了要删除的节点
  p->next=q->next;
  free(q);
  return head;
}

4. 函数测试

为了测试mydel函数,可以编写一个主函数main,并调用create函数创建一个包含10个结点的链表。然后,从用户输入中获取一个name值,并调用mydel函数删除对应name的结点。最后,使用show函数遍历并输出删除后的链表。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stu{
  char name[20];
  int no;
  struct stu *next;
};

struct stu * create();
struct stu * mydel(struct stu *head,char *name);
void show(struct stu *p){
  while(p){
    printf('%s %d\n',p->name,p->no);
    p=p->next;
  }
}

int main(){
  char name[20];
  struct stu *p=NULL;
  gets(name);
  p=create();
  p=mydel(p,name);
  show(p);
  return 0;
}

struct stu * create(){
  struct stu *p,*h=NULL,*q;
  char name[10][20]={'liming','maming','zhaoming','yaoming','xiaming','lixiaoming',
                      'zhangming','nieming','zhouming','hanming'};
  int i=0;
  while(i<10){
    p=(struct stu*)malloc(sizeof(struct stu));
    strcpy(p->name,name[i]);
    p->no=i;
    if(h==NULL){
      h=p;
      q=p;
    }
    else{
      q->next=p;
      q=p;
    }
    i++;
  }
  q->next=NULL;
  return h;
}

/* 请在这里填写答案 */

5. 测试用例

  • 输入样例:
    liming
    
    输出样例:
    maming 1
    zhaoming 2
    yaoming 3
    xiaming 4
    lixiaoming 5
    zhangming 6
    nieming 7
    zhouming 8
    hanming 9
    
  • 输入样例:
    zzzming
    
    输出样例:
    no found
    liming 0
    maming 1
    zhaoming 2
    yaoming 3
    xiaming 4
    lixiaoming 5
    zhangming 6
    nieming 7
    zhouming 8
    hanming 9
    

6. 代码解释

  1. 函数mydel首先检查头结点的name域是否与输入的name值相同。如果相同,则将头指针指向下一个结点,并释放头结点空间。
  2. 如果头结点不是要删除的结点,则从第二个结点开始遍历链表,直到找到目标结点或遍历到链表末尾。
  3. 如果找到目标结点,则将目标结点的前一个结点的next指针指向目标结点的下一个结点,并释放目标结点空间。
  4. 如果没有找到目标结点,则输出“no found”并返回头指针。

总结

本文介绍了如何在C语言中实现一个删除链表结点的函数mydel,以及如何进行测试。该函数可以有效地删除链表中指定的结点,并返回删除后的链表头指针。


原文地址: https://www.cveoy.top/t/topic/nydm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录