由于时间仓促,作者并没有进行任何的检查,总之徒手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");
}

C/C++单向链表的更多相关文章

  1. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  2. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  3. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  4. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  5. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

  6. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  7. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  8. 输入一个单向链表,输出该链表中倒数第K个结点

    输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...

  9. 单向链表JAVA代码

        //单向链表类 publicclassLinkList{       //结点类     publicclassNode{         publicObject data;         ...

  10. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

随机推荐

  1. facebook注册不了无法打开官网的解决办法

    上周有一个朋友问到我一个问题,问怎么facebook注册不了,facebook官网也无法打开?这个问题不知道有没有人遇到过,以前这个问题也困扰了我挺长时间的,其实想想也挺简单的,由于facebook, ...

  2. LdapContext获取对象的属性

    //            dn = "cn=1,cn=Users,DC=域名,DC=COM";//            Attributes answer = ctx.getA ...

  3. acm 士兵杀敌(一)

    士兵杀敌(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军现在 ...

  4. Java基础--枚举Enum

    Java中的枚举是一种特殊的类,可以将一组固定常量的集合组成一种类型,使用方便且类型安全.使用enum关键字定义. enum类型父类为Enum,通过Enum.class可见Enum为抽象类,实现了Co ...

  5. 关于HTML标签中的一些容易忘记常用样式属性

    样式说明--样式: margin, margin-top/left/bottom/right -- 外边距; padding, padding-top/left/botton/right -- 内边距 ...

  6. java代码继承疑惑,请有心人解答

    总结:这段程序没有问题,编译运行都是可以的.关键是,子类的无参构造方法第一句少了super(a,b);运行后,显示了双重结果 .还有.如果子类中没有声明成员变量String  name.那么结果显示父 ...

  7. Oracle 静默安装 oracle 12c

    [oracle@local12cdg app]$ id oracleuid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)[or ...

  8. Spring学习五

    1: servlet生命周期:  Servlet加载    ->   实例化->   服务 ->  销毁 2:Servlet重要函数: init():在Servlet的生命周期中,仅 ...

  9. [转]浅谈javascript函数劫持

    转自:Ph4nt0m Security Team 这么多年了,现在学习依然还是有很多收货,向前辈致敬.转载一方面是自己存档一份,另一方面是让更多喜欢安全的人一同学习. ================ ...

  10. python 三元表达式、列表推导式、生成器表达式

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='mm' if name == 'hahah' else 'NB' print( ...