C实现头插法和尾插法来构建非循环双链表(不带头结点)

在实际使用中,双链表比单链表方便很多,也更为灵活。对于不带头结点的非循环双链表的基本操作,我在《C语言实现双向非循环链表(不带头结点)的基本操作》这篇文章中有详细的实现。今天我们就要用两种不同的方式头插法和尾插法来建立双链表。代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsertDoubleList  。

核心代码如下:

//尾插法创建不带头结点的非循环双向链表
Node *TailInsertCreateList(Node *pNode){

    Node *pInsert;
    Node *pMove;
    pInsert = (Node*)malloc(sizeof(Node));
    memset(pInsert, 0, sizeof(Node));
    pInsert->next = NULL;
    pInsert->prior = NULL;

    scanf("%d",&(pInsert->element));
    pMove = pNode;

    if (pInsert->element <= 0) {

        printf("%s函数执行,输入数据非法,建立链表停止\n",__FUNCTION__);
        return NULL;
    }

    while (pInsert->element > 0) {
        if (pNode == NULL) {
            pNode = pInsert;
            pMove = pNode;
        }else{

            pMove->next = pInsert;
            pInsert->prior = pMove;
            pMove = pMove->next;
        }

        pInsert = (Node *)malloc(sizeof(Node));
        memset(pInsert, 0, sizeof(Node));
        pInsert->next = NULL;
        pInsert->prior = NULL;
        scanf("%d",&(pInsert->element));
    }

    printf("%s函数执行,尾插法建立链表成功\n",__FUNCTION__);

    return pNode;
}

//头插法创建不带头结点的非循环双向链表
Node *HeadInsertCreateList(Node *pNode){

    Node *pInsert;
    pInsert = (Node *)malloc(sizeof(Node));
    memset(pInsert, 0, sizeof(Node));

    pInsert->next = NULL;
    pInsert->prior = NULL;
    scanf("%d",&(pInsert->element));

    if (pInsert->element <= 0) {

        printf("%s函数执行,输入数据非法,建立链表停止\n",__FUNCTION__);
        return NULL;
    }

    while (pInsert->element > 0) {
        if (pNode == NULL) {
            pNode = pInsert;
        }else{

            pInsert->next = pNode;
            pNode->prior = pInsert;
            pNode = pInsert;
        }

        pInsert = (Node *)malloc(sizeof(Node));
        memset(pInsert, 0, sizeof(Node));
        pInsert->next = NULL;
        pInsert->prior = NULL;
        scanf("%d",&(pInsert->element));
    }

    printf("%s函数执行,头插法建立链表成功\n",__FUNCTION__);
    return pNode;
}
时间: 2024-10-13 01:38:13

C实现头插法和尾插法来构建非循环双链表(不带头结点)的相关文章

C实现头插法和尾插法来构建单链表(不带头结点)

链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.假设想要了解链表的概念和其它链表操作.请參考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.演示样例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // Hea

C实现头插法和尾插法来构建链表

链表的构建其实也就是不断插入节点的过程.而节点的插入可以分为头插法和尾插法.头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.如果想要了解链表的概念和其他链表操作,请参考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.示例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // HeadIns

单链表的头插法和尾插法c语言实现

/*单链表的头插法和尾插法c语言实现*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义一个链表节点的数据单元*/typedef struct student_t{ int num; char name[SIZE]; struct student_t* pNext;}studentList, *pStudentList; /*定义一个全局的静态的链表头节点指针

链表的头插法和尾插法

链表的头插法和尾插法 本文的链表均是带头结点的链表. 链表可以说是最简单的链式结构,在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

单链表:头插法和尾插法

头插法: linklist *CreateList_Front() { linklist *head, *p; char ch; head = NULL; printf("依次输入字符数据(‘#’表示输入结束):\n"); ch = getchar(); while(ch != '#') { p = (linklist*)malloc(sizeof(linklist)); p->data = ch; p->next = head; head = p; ch = getcha

头插法和尾插法

. #include "stdio.h" #include "stdlib.h" typedef struct List { int data; //数据域 struct List *next; //指针域 } List; void TailCreatList(List *L) //尾插法建立链表 { List *s, *r;//s用来指向新生成的节点.r始终指向L的终端节点. r = L; //r指向了头节点,此时的头节点是终端节点. for (int i = 0

头插法尾插法按位置插入创建删除链表

/* * 时间:2015年7月28日07:54:10 * 项目:单链表(头插法和尾插法) */ # include <stdio.h> typedef int ElemType; typedef struct Node{ Node *next; ElemType data; }LinkList; /*头插法,拥有头指针*/ void InitLinkListHead(LinkList *headList) { headList->next = NULL; headList->dat

采用头插插法和尾插法建立单项链表

PS: 来源2014年数据结构联考复习指导 Page27. #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; const int END_INPUT = -1; typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; LinkList CreatList1(LinkList

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客<C语言实现非循环双链表节点的删除(不带头结点)>中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦.自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便.代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList . 核心代码如下: //删除pos位置的节点 int DeletePosList(Node *pHead,Node *pTail,int pos){