线性表之单向链表的创建、插入、删除和清除

删除一个节点,只需要将前向节点和后向节点接续即可;

插入一个节点,需要将前向节点和插入节点接续、插入节点和后向节点接续。

1.源程序

list.c

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

typedef struct node{
  int num;
  char name[128];
  struct node *next;
}Lnode;

//初始创建链表
Lnode* CreateList();
//打印链表中所有信息
void PrintList(Lnode* head);
//根据学号删除链表节点
Lnode* DeleteNode(Lnode* head);
//在某个学号后插入节点
void InsertNode(int num,Lnode* head);
//清除整个链表
void ClearList(Lnode** headptr);


int main()
{
  Lnode* head = NULL;
  int flag = -1;
  do{
    printf("###################################################\n");
    printf("请输入:\n1——创建链表\n");
    printf("2——打印链表\n");
    printf("3——插入节点\n");
    printf("4——删除节点\n");
    printf("5——清除链表\n");
    printf("0——退出程序\n");
    printf("###################################################\n");
    scanf("%d",&flag);
    switch(flag){
      case 0: break;
      case 1:{
        head = CreateList();
        continue;
      }
      case 2:{
        PrintList(head);
        continue;
      }
      case 3:{
        printf("请输入在哪个学号后插入:\n");
        int num;
        scanf("%d",&num);
        InsertNode(num,head);
        continue;
      }
      case 4:{
        head = DeleteNode(head);
        continue;
      };
      case 5:ClearList(&head);
    }
  }while(flag);
  return 0;
}

void ClearList(Lnode** headptr)//指向指针的指针;改变头指针的值
{
  Lnode* freenode;
  freenode = *headptr;
  while(freenode != NULL){
    free(freenode);
    freenode = freenode->next;
  }
  *headptr = NULL;
  printf("链表清除成功!\n");
}

Lnode* DeleteNode(Lnode* head)
{
  int num;
  Lnode* forword = head;//注意:单向链表只有后继指针、没有前驱指针;因此、需要记录删除节点的前一个节点
  Lnode* newhead = head;
  printf("请输入需要删除学号:");
  scanf("%d",&num);
  if(head->num == num){
    newhead = head->next;
    free(head);
    return newhead;
  }
  while((head->next != NULL) && (head->num != num)){
    forword = head;
    head = head->next;
  }
  if((head->next == NULL) && (head->num != num)) printf("链表中不存在这个节点!\n");
  else{
    printf("需要删除的学号是:%d,姓名是:%s\n",head->num,head->name);
    forword->next = head->next;
    free(head);
  }
  return newhead;
}

void InsertNode(int num,Lnode* head)
{
  while((head->next != NULL) && (head->num != num)){
    head = head->next;
  }
  if((head->next == NULL) && (head->num != num)) printf("链表中不存在这个节点!\n");
  else{
    Lnode* innode = (Lnode*)malloc(sizeof(Lnode));
    printf("请输入学号:");
    scanf("%d",&(innode->num));
    if(innode->num == 0){
      printf("学号不能为0!\n");
      free(innode);
      return;
    }
    printf("请输入姓名:");
    scanf("%s",innode->name);
    innode->next = head->next;
    head->next = innode;
  }
}

Lnode* CreateList()
{
  Lnode* head = NULL;//创建链表时,头指针的值是返回值、不能改变
  Lnode* innode = NULL;
  Lnode* tail = NULL;//创建链表时,相当与从表尾插入
  printf("请输入学号:");
  innode = (Lnode*)malloc(sizeof(Lnode));
  innode->next = NULL;
  scanf("%d",&(innode->num));
  printf("请输入姓名:");
  scanf("%s",innode->name);
  if(!(innode->num)){
    free(innode);
    return NULL;
  }
  do{
    if(!head) head = innode;
    else{
      tail = innode;
      printf("请输入学号:");
      innode = (Lnode*)malloc(sizeof(Lnode));
      innode->next = NULL;
      tail->next = innode;
      scanf("%d",&(innode->num));
      if(innode->num == 0){
        printf("学号不能为0!\n");
        free(innode);
        tail->next = NULL;
        return head;
      }
      printf("请输入姓名:");
      scanf("%s",innode->name);
    }      
  }while(innode->num);
  if(!(innode->num)){
    free(innode);
    tail->next = NULL;
  }
  return head;
}

void PrintList(Lnode* head)
{
  int i = 1;
  if(head == NULL){
    printf("链表为空!\n");
    return;
  }
  while(head){
    printf("第%d个人学号是:%d,姓名是:%s\n",i,head->num,head->name);
    head = head->next;
    i++;
  }
}

2.编译

gcc list.c -o list

3.运行

./list

###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
1
请输入学号:11
请输入姓名:张
请输入学号:13
请输入姓名:李
请输入学号:0
学号不能为0!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:13,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
3
请输入在哪个学号后插入:
11
请输入学号:12
请输入姓名:王
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
3
请输入在哪个学号后插入:
13
请输入学号:14
请输入姓名:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:12,姓名是:王
第3个人学号是:13,姓名是:李
第4个人学号是:14,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
4
请输入需要删除学号:12
需要删除的学号是:12,姓名是:王
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
4
请输入需要删除学号:14
需要删除的学号是:14,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
第1个人学号是:11,姓名是:张
第2个人学号是:13,姓名是:李
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
5
链表清除成功!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
2
链表为空!
###################################################
请输入:
1——创建链表
2——打印链表
3——插入节点
4——删除节点
5——清除链表
0——退出程序
###################################################
0

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值