头文件Linear.h

// 单链表的类型定义
typedef struct node
{
int data; // 数据域
struct node *next; // 指针域
}Node, *LinkList;

因为单链表头结点和插入的结点要动态生成,所以要引入系统头文件<stdlib.h>或者<malloc.h>,不然会报错。

1. 初始化单链表

LinkList InitiateLinkList()
{
LinkList head; // 头指针
head = malloc(sizeof(Node)); // 动态创建头结点
head->next = NULL;
return head;
}

2.  求单链表的长度:出了头结点的所有结点的个数,包括首结点

int LengthLinkList(LinkList head)
{
int cnt = ;
Node *p = head;
while(p->next != NULL)
{
p = p->next;
cnt++;
}
return cnt;
}

3.读表元素

 在单链表head中查找第i个元素结点。若找到,返回指向该节点的指针,否则返回NULL

Node * GetLinkList(LinkList head, int i)
{
int c = ;
Node *p;
p = head -> next; // 初始化时,p指向首结点 while((c < i) && (p != NULL))
{
p = p->next;
c++;
}
if(c == i) return p;
else return NULL;/**/ }

4. 插入元素

在表head的第i个数据元素结点之前插入一个以x为值的新结点

void InsertLinkList(LinkList head, int x, int i)
{
Node *p, *q;
if(i == ) q = head;
else q = GetLinkList(head, i - ); // 找到第i - 1个数据元素结点,方便在其后插入 if(q == NULL) printf("找不到插入位置。\n");
else
{
p = malloc(sizeof(Node));
p->data = x;
p->next = q->next;
q->next = p;
}
}

5. 单链表删除
删除表head的第i个结点

void DeleteLinkList(LinkList head, int i)
{
// 先找到待删结点的直接前驱
Node *q, *p;
if(i == ) q = head;
else q = GetLinkList(head, i - ); // 若前驱结点存在且待删结点存在
if(q != NULL && q->next != NULL)
{
p = q->next;
q->next = p->next;
free(p); // 释放已移出结点p的空间
}
else
{
printf("找不到待删结点\n");
}
}

6.遍历单链表

void traverseList(LinkList head)
{
Node *p;
p = head->next;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

7. 定位
求表head中第一个值等于x的结点的序号,若不存在这种结点,返回结果为0

int LocateLinkList(LinkList head, int x)
{
int i = ;
Node * p = head; // p是工作指针
p = p->next; // 初始时p指向首结点
while(p != NULL && p->data != x)
{
i++;
p = p->next;
}
if(p != NULL) return i + ;
else return ;
}

全部代码:

#include <stdio.h>
#include <stdlib.h>
#include "Linear.h" // 单链表
// p 是工作指针 // 1. 初始化
LinkList InitiateLinkList()
{
LinkList head; // 头指针
head = malloc(sizeof(Node)); // 动态创建头结点
head->next = NULL;
return head;
} // 2. 求表长
int LengthLinkList(LinkList head)
{
int cnt = ;
Node *p = head;
while(p->next != NULL)
{
p = p->next;
cnt++;
}
return cnt;
} // 3. 读表元素
// 在单链表head中查找第i个元素结点。若找到,返回指向该节点的指针,否则返回NULL
Node * GetLinkList(LinkList head, int i)
{
int c = ;
Node *p;
p = head -> next; // 初始化时,p指向首结点 while((c < i) && (p != NULL))
{
p = p->next;
c++;
}
if(c == i) return p;
else return NULL;/**/ } // 4. 插入元素
// 在表head的第i个数据元素结点之前插入一个以x为值的新结点
void InsertLinkList(LinkList head, int x, int i)
{
Node *p, *q;
if(i == ) q = head;
else q = GetLinkList(head, i - ); // 找到第i - 1个数据元素结点,方便在其后插入 if(q == NULL) printf("找不到插入位置。\n");
else
{
p = malloc(sizeof(Node));
p->data = x;
p->next = q->next;
q->next = p;
}
} // 5. 单链表删除
// 删除表head的第i个结点
void DeleteLinkList(LinkList head, int i)
{
// 先找到待删结点的直接前驱
Node *q, *p;
if(i == ) q = head;
else q = GetLinkList(head, i - ); // 若前驱结点存在且待删结点存在
if(q != NULL && q->next != NULL)
{
p = q->next;
q->next = p->next;
free(p); // 释放已移出结点p的空间
}
else
{
printf("找不到待删结点\n");
}
} // 6.遍历单链表
void traverseList(LinkList head)
{
Node *p;
p = head->next;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} // 7. 定位
// 求表head中第一个值等于x的结点的序号,若不存在这种结点,返回结果为0
int LocateLinkList(LinkList head, int x)
{
int i = ;
Node * p = head; // p是工作指针
p = p->next; // 初始时p指向首结点
while(p != NULL && p->data != x)
{
i++;
p = p->next;
}
if(p != NULL) return i + ;
else return ;
} main()
{
// 初始化变量
LinkList head;
int cnt; head = InitiateLinkList();
printf("初始化成功!\n"); cnt = LengthLinkList(head);
printf("单链表的长度:%d\n", cnt); // 单链表插入结点
InsertLinkList(head, , );
InsertLinkList(head, , );
InsertLinkList(head, , );
InsertLinkList(head, , );
InsertLinkList(head, , );
InsertLinkList(head, , );
InsertLinkList(head, , ); cnt = LengthLinkList(head);
printf("单链表的长度:%d\n", cnt); // 遍历单链表
traverseList(head); // 删除结点
DeleteLinkList(head, ); traverseList(head); printf("结点的值为88的序号为:%d\n", LocateLinkList(head, )); }

一般的单链表结束。特殊的没写。

C语言——单链表初始化、求表长、读表元素、插入元素的更多相关文章

  1. 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)

    /* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...

  2. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  3. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  4. C语言实现单链表(不带头结点)节点的插入

    对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...

  5. C语言—单链表

    单链表操作:读取,插入和删除 #include "stdafx.h" #include <string.h> #include <stdio.h> #inc ...

  6. c语言-单链表(二)

    继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...

  7. c语言单链表实现

    /************************************************************************* > File Name: singleLin ...

  8. C语言单链表的实现

    // //  main.c //  gfhjhgdf // //  Created by chenhao on 13-12-23. //  Copyright (c) 2013年 chenhao. A ...

  9. 零基础玩转C语言单链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

随机推荐

  1. mysq exists和in

    我们在学习Yii2的时候,一定接触过这样的where输入 $query->where(["exists",xxxx]); User::find()->where([&q ...

  2. [转] AKKA简介

    [From] https://blog.csdn.net/linuxarmsummary/article/details/79399602 Akka in JAVA(一) AKKA简介 什么是AKKA ...

  3. 仿照swpu邮寄系统的登录页面

    实验过程 跟着老师的文档过了一遍手,稍作了修改 效果展示 页面在网盘: 链接:https://pan.baidu.com/s/1jsT0SDiiJXzPtR93ZAh1YA 提取码:9miq

  4. js map 、filter 、forEach 、every、some 的用法

    1.map 首先map 就是将原数组 映射成 新的数组: 其次map 有返回值 2.filter 对数组中的每个元素都执行一次指定的函数(callback),并且创建一个新的数组,该数组元素是所有回调 ...

  5. Java框架-mybatis03使用注解实现mybatis

    1.面向接口编程: 好处:扩展性好,分层开发中,上层不用管具体的实现,都遵循共同的标准,使得开发变得容易.规范性更好 2.注解的实现 a)编写Dao接口 public interface UserDa ...

  6. 分布式集群HBase启动后某节点的HRegionServer自动消失问题

    详细问题   我这里是,我的这个slave1的HRegionServer 进程启动后,不久自动消失.           去查看日志,排查问题: 发现问题: 解决办法 [hadoop@master h ...

  7. spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue

    一: ThreadPoolTaskExecutor是一个spring的线程池技术,查看代码可以看到这样一个字段: private ThreadPoolExecutor threadPoolExecut ...

  8. object与byte[]的相互转换、文件与byte数组相互转换

    转载自   https://blog.csdn.net/scimence/article/details/52233656 object与byte[]互转 /// <summary> // ...

  9. UEditor编辑器 字符数统计和字符数限制 问题

    1.百度UEditor修改右下角统计字数默认只统计前台所见的文字个数,为了便于展示实际保存的时候是保存的包含html标签的,所以右下角的统计字数功能需要修改 getContentLength: fun ...

  10. Codeforces 671 A——Recycling Bottles——————【思维题】

     Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standard ...