C++实现单链表(初始化指定长度的单链表)

在这里插入图片描述

#include <stdio.h>
#include <malloc.h>

typedef struct SNode
{
  // 数据域
  int data;
  // 指针域
  struct SNode *next;
} * PNode, Node;
// PNode=struct SNode*  Node=struct SNode

// 初始化一个链表
PNode init_list();
// 插入元素
bool insert(PNode, int, int);
// 删除结点
bool delete_node(PNode, int, int *);
// 获得链表的长度
int get_length(PNode);
// 判断链表是否为空
bool is_empty(PNode);
// 对链表进行排序
void sort_list(PNode);
// 输出链表
void show_list(PNode);
//销毁链表 把头指针及后续结点全部干掉
void destory_list(PNode *);

int main()
{
  PNode list = init_list();
  printf("链表初始化结束:\n");
  show_list(list);
  printf("排序(升序):");
  sort_list(list);
  show_list(list);
  printf("链表的长度是%d:\n", get_length(list));
  printf("插入测试元素:");
  insert(list, 1, 1);
  insert(list, 4, 4);
  insert(list, 1, 3);
  show_list(list);
  printf("删除链表中第三个结点:");
  int val;
  delete_node(list, 3, &val);
  printf("删除的元素是%d\n", val);
  show_list(list);
  destory_list(&list);
  printf("销毁链表==>");
  show_list(list);
  return 0;
}

PNode init_list()
{
  //链表的长度
  int length;
  //链表结点的值
  int val;
  //头指针指向头结点
  PNode pHead = (PNode)malloc(sizeof(PNode));
  if (NULL == pHead)
  {
    printf("链表初始化失败!");
  }
  //初始化头结点
  pHead->next = NULL;
  pHead->data = 0;
  //创建指长度的链表
  printf("请输入要生成的链表的长度:");
  scanf("%d", &length);
  //此时尾结点就是头结点
  PNode pTail = pHead;
  for (int i = 0; i < length; i++)
  {
    printf("请输入第%d个结点的值:", i + 1);
    scanf("%d", &val);
    //新生成的结点  每生成一个结点 挂在链表的最后
    PNode pNew = (PNode)malloc(sizeof(SNode));
    //给新生成的结点数据域赋值
    pNew->data = val;
    pNew->next = NULL;
    //挂在链表的末尾
    pTail->next = pNew;
    //更新尾结点的位置
    pTail = pNew;
  }
  return pHead;
}

bool is_empty(PNode pHead)
{
  if (NULL != pHead)
  {
    printf("链表不存在!");
  }
  return NULL == pHead->next;
}

/**
 * @param pHead 链表
 * @param pos   插入位置
 * @param val   要插入的值 可以追加在链表的最后
 */
bool insert(PNode pHead, int pos, int val)
{
  int i = 0;
  PNode p = pHead;
  // 寻找插入位置 找到插入位置的前一个结点
  while (p != NULL && i < pos - 1)
  {
    p = p->next;
    i++;
  }
  // 检查插入位置是否合法
  if (p != NULL && i < pos - 1)
  {
    return false;
  }
  // 创建新的结点
  PNode pNew = (PNode)malloc(sizeof(Node));
  pNew->data = val;
  pNew->next = p->next;
  p->next = pNew;
  return true;
}

bool delete_node(PNode pHead, int pos, int *val)
{
  int i = 0;
  PNode p = pHead;
  while (p != NULL && i < pos - 1)
  {
    p = p->next;
    i++;
  }

  if (NULL == p || i > pos - 1)
  {
    return false;
  }
  // 搞一个中间变量暂时保存要删除的结点 要不然删完就找不到它了
  PNode pTemp = p->next;
  //储存删除的结点中的数据
  *val = pTemp->data;
  p->next = p->next->next;
  free(pTemp);
  p = NULL;
  return true;
}

int get_length(PNode pHead)
{
  if (NULL == pHead)
  {
    return -1;
  }
  int count = 0;
  PNode p = pHead->next;
  while (NULL != p)
  {
    count++;
    p = p->next;
  }
  return count;
}

void sort_list(PNode pHead)
{
  PNode p, q;
  for (p = pHead->next; p->next != NULL; p = p->next)
  {
    for (q = p->next; q != NULL; q = q->next)
    {
      if (p->data > q->data)
      {
        int temp;
        temp = q->data;
        q->data = p->data;
        p->data = temp;
      }
    }
  }
}

void show_list(PNode pHead)
{
  if (NULL == pHead)
  {
    printf("链表不存在!");
    return;
  }
  PNode p = pHead->next;
  if (NULL != p)
  {
    while (NULL != p)
    {
      printf("%d\t", p->data);
      p = p->next;
    }
    printf("\n");
  }
  else
  {
    printf("链表为空!");
  }
}

void destory_list(PNode *pHead)
{
  PNode p, pTemp;
  p = *pHead;
  while (p)
  {
    pTemp = p->next;
    free(p);
    p = pTemp;
  }
  *pHead = NULL;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鑫宇_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值