由于时间仓促,作者并没有进行任何的检查,总之徒手165行,调试无BUG,基本功能的实现并无大问题,可能有些细节考虑不周(这也是C/C++的诟病,小车不倒只管前推),还忘见谅。

代码是在C++环境编写,可以在C编译平台运行,但要进行修改(把声明变量语句,写在执行语句之前)。

#include <stdio.h>
#include <stdlib.h>
//定义节点,所有节点必须用malloc()申请在堆中,在程序执行阶段保证空间的存在;
//-1表示非正常退出
typedef struct node
{
int data;
node *next;
} Node;
//用来表示链表的长度,-1表示无头节点的空表
int len = -;
//定义一个全局头结点
Node *head = NULL; //创建一个带有头节点的空链表
void createNodeList()
{
if (head != NULL)//表示为非空表
exit(-);//非正常退出
head = (Node *)malloc(sizeof(Node));//申请堆空间
if (head == NULL) //如果head==NULL则申请失败
exit(-);
//头结点的数据域为0,指针域为NULL
head->data = ;
head->next = NULL;
len = ;//0表示有头节点的空表 } //添加一个节点(向当前节点的指针域为NULL的节点后面添加)
void addNode(int data)
{
if (head == NULL)//表示为空表
exit(-);
Node *newNode = (Node *)malloc((sizeof(Node)));//创建一个新节点
if (newNode == NULL)//申请失败
exit(-);
//初始化新结点的数据域和指针域
newNode->data = data;
newNode->next = NULL;
//连接工作
Node *p = head;//当前节点
Node *q = head->next;//下一个节点
while (q != NULL)
{
//循环成立表示当前结点的指针域不为NULL
p = q;//更新当前结点
q = p->next;//更新当前结点的
}
//循环结束表示当前节点的指针域为NULL
//更新当前节点指针域为新结点
p->next = newNode;
len++;//表长加一
}
//获取节点数据(0<index<len)
int getNode(int index)
{
int data = -;
if (head == NULL)//表示为空表
exit(-);
if (index < )//下标要从0开始
exit(-);
if (index >= len)//下标越界
exit(-);
Node *p = head->next;
data = p->data;
for (int i = ; i < index;i++)
{
p=p->next;
}
data = p->data;
return data;
}
//元素查找
int getData(int data)
{
if (head == NULL)//表示为空表
exit(-);
Node *p = head->next;//表示第一个节点
for (int i = ;p!=NULL;i++)
{
if (p->data==data)
return i;//返回下标
p = p->next;
}
}
//向屏幕打印链表
void getLinks()
{
if (head == NULL)//表示为空表
exit(-);
//指向第一个节点
Node *p = head->next;
//如果该结节不为NULL则表示存在该节点
while (p != NULL)
{
printf("%d\n", p->data);
p = p->next;
}
}
//删除节点
void removeNode(int index)
{
if (head == NULL)//表示为空表
exit(-);
if (index < )//下标要从0开始
exit(-);
if (index >= len)//下标越界
exit(-);
//p表示当前节点,q表示当前节点的指针域
Node *p = head;//要被删除的前一个节点
Node *q = head->next;//要被删除的节点
for (int i = ; i < index;i++)
{
p = q;
q = p->next;
}
//重新连接
p->next = q->next;
free(q);//删除q节点
len--;//表长减一
}
//清空链表
void cleanLinks()//表示为空表
{
if (head == NULL)
exit(-); Node *p = head;//当前节点
Node *q=head->next;//下一个节点
free(p);//删除当前节点
while (q!=NULL)
{
p = q;
q = p->next;
free(p);//删除当前节点
}
len = -;//表示该表为空
}
void main()
{
//创建表
createNodeList();
//添加元素
addNode();
addNode();
addNode();
addNode();
//打印表,和表长
getLinks();
printf("len:%d\n", len);
//查看第三个节点"4"
printf("index 3:%d\n",getNode());
//数据4所在节点下标
printf("data 4:%d\n",getData());
//删除第三个元素”3“
removeNode();
//分隔符
printf("=============\n");
//再次打印表和表长
getLinks();
printf("len:%d\n", len);
cleanLinks();
system("pause");
}

最新文章

  1. centos将自编译安装的apache添加为linux系统服务
  2. bower常用命令
  3. hadoop2——新MapReduces——yarm详解
  4. 使用LAMP创建基于wordpress的个从博客网站
  5. 构造activeMQ
  6. sort与qsort的用法,建议使用sort
  7. C#中split分隔字符串的应用
  8. linux(四)之元字符
  9. 我的第一个python web开发框架(37)——职位管理功能
  10. Java的selenium代码随笔(7)
  11. 机器学习笔记之三-yolov3+win7+vs2017+gpu+opencv编译
  12. spring 5.1.2 mvc RequestMappingHandlerMapping 源码初始化过程
  13. [Mac]如何让两个窗口各占半个屏幕
  14. [Shell]获取IP地址
  15. 做好平衡有多难?谈MMO的职业设计
  16. RAMPS1.4 3d打印控制板接线与测试2
  17. ny106 背包问题
  18. Log4j2的基本使用
  19. 洛谷::P1972 [SDOI2009]HH的项链
  20. 9-centos定时任务-不起作用- 没指明路径!!!

热门文章

  1. YII1.1分页
  2. Python函数-complex()
  3. 浅谈Manacher
  4. JavaScript函数的默认参数(default parameter)
  5. 推荐几个MySQL大牛的博客
  6. DIDAO.Common --- 项目中的常用类及其中函数
  7. Update多个字段从一个表中
  8. 使用内省的方式操作JavaBean
  9. c语言-单链表(二)
  10. 开发环境入门 linux基础 (部分)awk 赋值变量 if