C链表一——链表增删改查以及初始化的头插法与尾插法

线性表的链式存储又称为链表(物理实现方式);

链式存储是最常用的存储方式之一。它不仅可以用来表示线性表,而且可以用来表示各种非线性的数据结构;

链表又可分为单链表、双链表、循环链表等。

一:单链表

所谓单链表是指数据结点是单向排列的。它包括两个域,一个信息域用于存放数据,一个指针域用于存放下个结点的地址

单链表中结点类型的描述如下:

struct Node
{
    ElemType data_;
    Node *next_;
};

利用单链表可以解决顺序表需要大量的连续的存储空间的缺点,但是单链表附加了指针域,也带来了浪费存储空间的缺点。
注意:本文所有程序都是用“头指针”来表示一个单链表,而没有用带头结点的单链表。

头指针:是指向单链表第一个结点的指针;

头结点:单链表第一个结点之前附加的一个结点,此时,头指针指向头结点,头结点的指针域指向单链表的第一个结点;

结点的定义以及打印函数:

//结点声明
typedef struct tag
{
    int Nnum_;
    struct tag *Nnext_;
}Node, *pNode;

//打印函数
void link_print(pNode phead)
{
    while(phead != NULL)
    {
        printf("Node_value:%4d\n", phead->Nnum_);
        phead = phead->Nnext_;
    }
}

一:利用尾插法初始化单链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct tag
{
    int Nnum_;
    struct tag *Nnext_;
}Node, *pNode;

void link_print(pNode phead)
{
    while(phead != NULL)
    {
        printf("Node_value:%4d\n", phead->Nnum_);
        phead = phead->Nnext_;
    }
}

void link_init_tail(pNode *phead, int size) //传的是地址
{
    pNode pNew = NULL;
    pNode pTail = NULL;

    while( size > 0)
    {
        //申请内存
        pNew = (pNode)malloc(sizeof(Node)); //注意这里为何不用pNode而用Node,因为sizeof(pNode) = 4
        //赋值
        pNew->Nnum_ = rand()%1000;
        //插入链表
        if(*phead == NULL) //链表为空时
        {
            *phead = pNew;//连接新的结点
            pTail = pNew;
        }
        else//不为空
        {
            pTail->Nnext_ = pNew ; //连接新的结点
             pTail = pNew; //改名字
        }

        size --;
    }
}

int main(int argc, char const *argv[])
{
    srand(time(NULL));
    pNode phead = NULL;
    link_init_tail(&phead, 10);

    link_print(phead);

    return 0;
}

时间: 2024-10-10 08:03:44

C链表一——链表增删改查以及初始化的头插法与尾插法的相关文章

给定数组,创建(带头节点)的单链表(头插法、尾插法)

一般有两种常用的方法来建立单链表:头插法与尾插法. (1)头插法:每次将新申请的节点插在头节点的后面: 简单来说,就是把新加进的元素放在表头后的第一个位置: 首先,让新节点的next指向头节点之后:然后,让表头的next指向新节点. (2)尾插法:每次将新申请的节点插在终端节点的后面. #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } NODE; /

建立链表—头插法、尾插法—有无头结点

1.建立链表-头插法-头结点 1 //建立链表-头插法-头结点 2 LinkList CreatList_head() 3 { 4 DataType x; //数据 5 LinkList p,head; //结点 6 head = (LinkList)malloc(sizeof(LNode)); 7 head->next = NULL; 8 head->data = 0; 9 10 scanf("%d",&x); 11 while(x != 999) 12 { 13

Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdin和process.stdout的控制台输入输出.祝贺新手第一次发帖.哈哈哈. 代码如下: LinkList_node.js 1 //节点类的构造函数 2 function Node(element){ 3 this.element = element; 4 this.next = null; 5

自己用20分钟java实现的单向链表(含有增删改查操作)

package test1; // 建立一个链表结构 public class SingleList { //定义头结点指针 Node head = null; //定义链表的节点数据结构 class Node{ int val; Node next; public Node(int val){ this.val = val; next = null; } } //在链表的尾部增加一个节点 public void add(int num){ Node node = new Node(num);

使用Java实现对一个数组的增删改查以及初始化

import java.util.*; import java.lang.*; public class Array { private int[] data;// 数组 private int size;// 实际元素的个数 // 初始化数组大小 public Array(int capcity) { data = new int[capcity]; } // 默认数组大小为10 public Array() { this(10); } // 查看数组中元素个数 public int getS

【C】利用单链表数据结构实现通讯录,链表的增删改查

C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现. 结构体中放一个指向后接节点的指针与每一个结点应该存放的信息. 下面做一个命令行的通讯录来说明链表的增删改查这个问题. 一开始让用户输入链表,按1可以输出,按3可以删除. 可以修改: 可以插入. 按0则可以退出: 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

1题目 实现两个链表的合并 2基本功能要求: 1.建立两个链表A和B,链表元素个数分别为m和n个. 2.假设元素分别为(x1,x2,-xm),和(y1,y2, -yn).把它们合并成一个线性表C,使得: 当m>=n时,C=x1,y1,x2,y2,-xn,yn,-,xm 当n>m时,C=y1,x1,y2,x2,-ym,xm,-,yn 3.输出线性表C: 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D. 3测试数据: (1)A表(30,41,15,12,56,80) B表(23,56,

链表的头插法和尾插法

链表的头插法和尾插法 本文的链表均是带头结点的链表. 链表可以说是最简单的链式结构,在C语言中,通常用结构体封装其数据域及指针域作为一个结点. 今天我们说的是链表结点的构造方式以及插入方式. 尾插法 1 //尾插法 2 3 void createlistR(LNode *&C,int a[],int n){ 4 LNode *s,*r; 5 int i; 6 C = (LNode*)malloc(sizeof(LNode)); 7 C->next = NULL; 8 r = C; 9 for

单向链表增删改查的实现

/*实现单向链表的增删改查 */#include <malloc.h>#include <stdio.h>#include<stdlib.h>#define LEN sizeof(node) typedef struct node{ int num; struct node *next;}node,*pnode; /*在链表头进行插入,新节点成为头节点,原头节点成为新节点的下一个节点,头节点指针后伊一位*/void insert_head(pnode *phead,in