单链表相关操作(基于C语言)

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

单链表界说

  1. typedef struct node
  2. {
  3.         int data;
  4.         struct node* next;
  5. }LinkNode,*LinkList;
复制代码
版本一(可自己选择是否含头节点)

创建单链表

  1. /**
  2. * @brief 创建单链表
  3. * @param head 单链表存储位置
  4. * @param data 存储单链表的整数数组
  5. * @param size 数组大小
  6. * @param is_have_head 是否创建头节点,是为1,否则为0
  7. */
  8. LinkList CreateList(int data[], int size, int is_have_head) {
  9.         LinkList head = NULL;
  10.         LinkNode* p = NULL;
  11.        
  12.         head = (LinkNode*)malloc(sizeof(LinkNode));  // 创建头结点
  13.         head->next = NULL;
  14.         p = head;
  15.         for (int i = 0; i < size; i++) {
  16.                 LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
  17.                 newNode->data = data[i];
  18.                 newNode->next = NULL;
  19.                 if (head == NULL) {
  20.                         head = newNode;
  21.                         p = head;
  22.                 }
  23.                 else {
  24.                         p->next = newNode;
  25.                         p = p->next;
  26.                 }
  27.         }
  28.         if (!is_have_head && head != NULL) {  // 删除头结点
  29.                 LinkNode* temp = head;
  30.                 head = head->next;
  31.                 free(temp);
  32.         }
  33.         return head;
  34. }
复制代码
打印单链表

  1. /**
  2. * @brief 打印单链表
  3. * @param head 单链表指针
  4. * @param is_have_head 是否含头节点,是为1,否则为0
  5. */
  6. void PrintList(LinkList head, int is_have_head) {
  7.         LinkNode* p = head;
  8.         if (is_have_head) p = p->next;
  9.         if (!p) printf("空链表!\a\n");
  10.         else {
  11.                 while (p) {
  12.                         printf("%d->", p->data);
  13.                         p = p->next;
  14.                 }
  15.                 printf("NULL\n");
  16.         }
  17. }
复制代码
对单链表举行冒泡排序

  1. /**
  2. * @brief 对单链表进行冒泡排序
  3. * @param L 单链表指针L
  4. * @param is_have_head 是否含头节点,是为1,否则为0
  5. */
  6. void LinkBubbleSort(LinkList L, int is_have_head) {
  7.         LinkNode* head = L;
  8.         if (is_have_head) head = head->next;
  9.         LinkNode* p = head, * q = p->next, * last = NULL;
  10.         if (p == NULL || q == NULL) return;
  11.         while (head->next != last) {
  12.                 while (q && q != last ) {
  13.                         if (p->data > q->data) {
  14.                                 int temp = p->data;
  15.                                 p->data = q->data;
  16.                                 q->data = temp;
  17.                         }
  18.                         p = q;
  19.                         q = q->next;
  20.                 }
  21.                 last = p;
  22.                 p = head;
  23.                 q = p->next;
  24.         }
  25. }
复制代码
删除单链表中值为key的节点

  1. /**
  2. * @brief 删除单链表中值为key的节点
  3. * @param L 单链表L
  4. * @param key 目标值key
  5. * @param is_have_head 是否含头节点,是为1,否则为0
  6. * @return 删除成功返回true,否则返回false
  7. */
  8. bool ListDeleteNode(LinkList L, int key, int is_have_head) {
  9.         LinkNode* p = L, * pre = NULL;
  10.         if (is_have_head) {
  11.                 pre = p;
  12.                 p = p->next;
  13.         }
  14.         while (p && p->data != key) {
  15.                 pre = p;
  16.                 p = p->next;
  17.         }
  18.         if (!p) return false;
  19.         pre->next = p->next;
  20.         free(p);
  21.         return true;
  22. }
复制代码
求单链表表长

  1. /**
  2. * @brief 求链表长度
  3. * @param L 表头指针
  4. * @param is_have_head 是否含头结点,是为1,否则为0
  5. * @return 返回单链表的长度(不含头结点),空表返回0
  6. */
  7. int GetListSize(LinkList L, int is_have_head) {
  8.         LinkNode* p = L;
  9.         if (p == NULL) return 0;
  10.         if (is_have_head) p = p->next;
  11.         int count = 0;
  12.         while (p) {
  13.                 count++;
  14.                 p = p->next;
  15.         }
  16.         return count;
  17. }
复制代码
在单链表位序为i的位置插入新元素e

  1. /**
  2. * @brief 在单链表位序为i的位置插入新元素e
  3. * @param L 表头指针
  4. * @param i 插入位置(1<=i<=GetListSize(L)+1)
  5. * @param e 待插入元素e
  6. * @param is_have_head 是否含头结点,是为1,否则为0
  7. * @return 插入成功返回1,否则返回0
  8. */
  9. int ListInsert(LinkList L, int i, int e, int is_have_head) {
  10.         int list_size = GetListSize(L, is_have_head);
  11.         if (i < 1 || i > list_size + 1) return 0;  // 位序非法
  12.         LinkNode* p = L, * pre = NULL;
  13.         int cur = 1;
  14.         if (is_have_head) {
  15.                 pre = p;
  16.                 p = p->next;
  17.         }
  18.         while (cur < i) {
  19.                 pre = p;
  20.                 p = p->next;
  21.                 cur++;
  22.         }
  23.         LinkNode* new_node = (LinkNode*)malloc(sizeof(LinkNode));
  24.         new_node->data = e;
  25.         if (pre == NULL) { // 第一个位置插入
  26.                 new_node->next = L;
  27.                 L = new_node;
  28.         }
  29.         else {
  30.                 new_node->next = p;
  31.                 pre->next = new_node;
  32.         }
  33.         return 1;
  34. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表