带表头节点单链表及其基本应用

  • 结构体及其宏定义和所需要的C语言库
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define Overflow 2  //表示上溢
#define Underflow 3 //表示下溢
#define NotPresent 4 //表示元素不存在
#define Duplicate 5  //表示有重复元素
#define ElemType int //想要存储的数据类型, 可修改#define Status int
typedef struct node {ElemType element;      //结点的数据域struct node *link;      //结点的指针域
}Node;
typedef struct headerList {Node *head;int n;
}HeaderList;
  • 初始化
Status Init(HeaderList *h)
{h->head = (Node*)malloc(sizeof(Node)); //生成头节点if (!h->head) return ERROR;h->head->link = NULL; //空链表h->n = 0;return OK;
}
  • 插入
Status Insert(HeaderList *h, int i, ElemType x)
{Node *p, *q;int j;if (i < -1 || i > h->n - 1)return ERROR;p = h->head;for (j = 0; j <= i; j++)p = p->link;q = (Node*)malloc(sizeof(Node));q->element = x;q->link = p->link;p->link = q;h->n++;return OK;
}
  • 删除
Status Delete(HeaderList *h, int i)
{int j;Node *p, *q;if (!h->n)return ERROR;if (i<0 || i>h->n - 1)return ERROR;q = h->head;for (j = 0; j < i; j++)q = q->link;p = q->link;q->link = p->link;free(p);h->n--;return OK;
}
  • 查找
Status Find(HeaderList *h, int i, int *x)
{int j;Node *q;if (i < -1 || i > h->n - 1)return ERROR;q = h->head->link;for (j = 0; j < i; j++)q = q->link;*x = q->element;  //将该值传递回去return OK;
}
  • 输出
Status Output(HeaderList *h)
{Node *q;if (!h->n)return ERROR;q = h->head->link;while (q){printf("%d ", q->element);q = q->link;}putchar('\n');return OK;
}
  • 撤销
void Destory(HeaderList *h)
{Node *p, *q;p = h->head;while (p){q = p;p = p->link;free(q);q = NULL;}
}
  • 逆置
Status Inverse(HeaderList *h)
{int i, j, temp;int m;Node *p, *q;i = h->n / 2;if (!h->n)return ERROR;for (j = 0; j < i; j++){p = q = h->head->link;for (m = 0; m < j; m++)q = q->link;for (m = 0; m < h->n - 1 - j; m++)p = p->link;temp = p->element;p->element = q->element;q->element = temp;}return OK;
}
  • 交换
Status Swap(HeaderList *h, int i, int j)
{int temp, k;Node *p, *q;p = q = h->head->link;if (!h->n)return ERROR;if (i < -1 || i > h->n - 1)return ERROR;if (j < -1 || j > h->n - 1)return ERROR;for (k = 0; k < j; k++)q = q->link;for (k = 0; k < i; k++)p = p->link;temp = p->element;p->element = q->element;q->element = temp;return OK;
}
  • 排序
Status Sort(HeaderList *h)
{int i, j, a, b;Find(h, 0, &a);for (i = 0; i < h->n - 1; i++){Find(h, i, &a);for (j = i; j < h->n; j++){Find(h, j, &b);if (a > b){temp = a;a = b;b = temp;Swap(h, i, j);}}}return OK;
}
  • 随便验证了一下
int main()
{int i;HeaderList list;Init(&list);srand(time(NULL));for (i = 0; i < 10; i++)Insert(&list, i - 1, rand() % 20);Output(&list);Inverse(&list);Output(&list);Sort(&list);Output(&list);Destory(&list);return 0;
}

源代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ERROR 0
#define OK 1
#define Overflow 2  //表示上溢
#define Underflow 3 //表示下溢
#define NotPresent 4 //表示元素不存在
#define Duplicate 5  //表示有重复元素
#define ElemType int //想要存储的数据类型, 可修改#define Status int
typedef struct node {ElemType element;      //结点的数据域struct node *link;      //结点的指针域
}Node;
typedef struct headerList {Node *head;int n;
}HeaderList;//初始化
Status Init(HeaderList *h)
{h->head = (Node*)malloc(sizeof(Node)); //生成头节点if (!h->head)return ERROR;h->head->link = NULL; //空链表h->n = 0;return OK;
}//插入
Status Insert(HeaderList *h, int i, ElemType x)
{Node *p, *q;int j;if (i < -1 || i > h->n - 1)return ERROR;p = h->head;for (j = 0; j <= i; j++)p = p->link;q = (Node*)malloc(sizeof(Node));q->element = x;q->link = p->link;p->link = q;h->n++;return OK;
}//删除
Status Delete(HeaderList *h, int i)
{int j;Node *p, *q;if (!h->n)return ERROR;if (i<0 || i>h->n - 1)return ERROR;q = h->head;for (j = 0; j < i; j++)q = q->link;p = q->link;q->link = p->link;free(p);h->n--;return OK;
}//查找
Status Find(HeaderList *h, int i, int *x)
{int j;Node *q;if (i < -1 || i > h->n - 1)return ERROR;q = h->head->link;for (j = 0; j < i; j++)q = q->link;*x = q->element;  //将该值传递回去return OK;
}//输出
Status Output(HeaderList *h)
{Node *q;if (!h->n)return ERROR;q = h->head->link;while (q){printf("%d ", q->element);q = q->link;}putchar('\n');return OK;
}//撤销
void Destory(HeaderList *h)
{Node *p, *q;p = h->head;while (p){q = p;p = p->link;free(q);q = NULL;}
}//逆置
Status Inverse(HeaderList *h)
{int i, j, temp;int m;Node *p, *q;i = h->n / 2;if (!h->n)return ERROR;for (j = 0; j < i; j++){p = q = h->head->link;for (m = 0; m < j; m++)q = q->link;for (m = 0; m < h->n - 1 - j; m++)p = p->link;temp = p->element;p->element = q->element;q->element = temp;}return OK;
}//交换
Status Swap(HeaderList *h, int i, int j)
{int temp, k;Node *p, *q;p = q = h->head->link;if (!h->n)return ERROR;if (i < -1 || i > h->n - 1)return ERROR;if (j < -1 || j > h->n - 1)return ERROR;for (k = 0; k < j; k++)q = q->link;for (k = 0; k < i; k++)p = p->link;temp = p->element;p->element = q->element;q->element = temp;return OK;
}//排序
Status Sort(HeaderList *h)
{int i, j, a, b, temp;for (i = 0; i < h->n - 1; i++){Find(h, i, &a);for (j = i + 1; j < h->n; j++){Find(h, j, &b);if (a > b){temp = a;a = b;b = temp;Swap(h, i, j);}}}return OK;
}int main()
{int i;HeaderList list;Init(&list);srand(time(NULL));for (i = 0; i < 10; i++)Insert(&list, i - 1, rand() % 20);Output(&list);Inverse(&list);Output(&list);Sort(&list);Output(&list);Destory(&list);return 0;
}

带表头节点单链表及其基本应用相关推荐

  1. C语言实现带表头节点的链表

    数据结构及接口(Header_List.h) #ifndef HEADER_LIST_H_INCLUDED #define HEADER_LIST_H_INCLUDED#include <std ...

  2. 带头节点单链表的增删改查

    单链表有很多结构循环单链表,有头节点的单链表,无头节点的单链表,双节点单链表,以下源码是以有一个头节点的单链表为例写的增删改查的各种功能,就是下图 然后各个注释也在函数后面写着,这玩意确实还挺难,源码 ...

  3. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  4. 带有头节点单链表,带有头节点单链表逆置的四种方法

    文章目录 带头结点的单链表 单链表逆置的四种做法 带头结点的单链表 链式存储结构:逻辑上相邻的数据元素,并不要求物理上也相邻: 单链表的代码实现 .h文件 #pragma once typedef i ...

  5. c语言带头节点单链表创建,C语言建立带头结点的单链表

    满意答案 TS老妹儿 2017.08.31 采纳率:57%    等级:9 已帮助:1719人 单链表的生成有2种方式:头插法和尾插法. 1.头插法/************************* ...

  6. 带头与不带头节点单链表

    一.链表与顺序表区别 二.链表的结构 1.带头节点 2.不带头节点 三.实现一个带头节点的链表 方法: 1.增加(头插.尾插) 2.删除某个节点 3.输出链表 4.得到链表指定位置节点 5.逆置链表 ...

  7. C语言——带头节点单链表常见操作

    #include <stdio.h> #include <stdlib.h> typedef struct stu {int data; //存放数据struct stu* n ...

  8. 递归函数反向显示单链表

    题目 不带表头的单链表, 结点类型: typedef struct LNode{int data;struct LNode* next; }Node; ,使用递归函数反向显示以h为头指针的单链表的所有 ...

  9. 单链表的基本操作----------头插法/尾插法建立链表

    头插法 步骤: 1.在内存中找开辟一个空间,作为链表的头节点,将头结点滞空. 具体代码: L = (LinkList)malloc(sizeof(ND)); L -> next = NULL; ...

最新文章

  1. JAVA代码实现下载单个文件,和下载打包文件
  2. Crystal Reports图表(上)
  3. poj3422(最小费用流 + 拆点)
  4. Hibernate基本原理(一)
  5. easyui 消息框按钮文字修改
  6. JAVA课堂作业整理一
  7. python能开发手机程序吗_python能否开发安卓应用app?当然可以,python助你轻松搞定...
  8. 1-jdk的安装与配置
  9. 让我们来比较C#,C++和Java之间重写虚函数的区别
  10. Python爬虫必备技能,Xpath提取数据规格详解
  11. 算法竞赛中的输入输出框架
  12. iis6 无法访问网站_IIS重启无效
  13. linux make指定目标平台,CMake on Linux:目标平台不支持动态链接
  14. js Function.call
  15. 统计学习方法读书笔记16-SVM支持向量机
  16. nodejs怎么使用爬虫HTTP代理IP抓取数据
  17. 众人帮怎么发布悬赏任务?发布任务所需要求条件是什么?
  18. 【科目一】你必须知道的驾考交通标志大全
  19. 微信网页授权之取消授权
  20. 03-行为型设计模式

热门文章

  1. 可爱妈妈对我的\情色\教育
  2. Day14作业 二、有两个List集合怎么取两个无重复的并集
  3. [LeetCode] Invert Binary Tree - 二叉树翻转系列问题
  4. Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作
  5. 【数据结构与算法】之深入解析“石子游戏VIII”的求解思路与算法示例
  6. 【Qt】仿360安全卫士界面(自定义阴影边框类)
  7. 【Tools】MarkDown教程(六)-Markdown Reference
  8. 【Linux】一步一步学Linux——man命令(有问题找男人)(13)
  9. 【Tools】Windows下Git 2.18安装步骤
  10. c语言 链表 删除节点,C语言实现单链表节点的删除(不带头结点)