带有头结点的链表的基本操作

#ifndef _LIST_h_
#define _LIST_h_

//链表中的数据结构
typedef struct Link_data
{
    int a;
    int b;
}Node_data;

//链表节点结构
typedef struct Link_node
{
    Node_data    data;
    struct Link_node  *pNext;
}Node;

Node* CreateList(void);
Node* FindNodeByGlobalIndex(Node *pHead, int iGlobalIndex);
Node* Insert2ListTail(Node *pHead, Node_data  *pAutoInfo);
int RemoveList(Node *pHead);
void  PrintList(Node *pHead);
int DeleteList (Node *pHead,int x);
void ReverseList(Node *pHead);
void SortList(Node *pHead);
#endif
#include <string.h>
#include <malloc.h>
#include<stdio.h>
#include"list.h"

/*************************************************
Function      : CreateList
Description   : 创建链表头节点
Return        : 链表的头指针
*************************************************/
Node* CreateList(void)
{
    Node *pHead = NULL;

    //申请的头指针
    pHead = (Node *)malloc(sizeof(Node));

    //判断是否申请成功
    if (NULL == pHead)
    {
        return NULL;
    }

    //针对具体结构进行初始化
    pHead->data.a = 0;
    pHead->data.b = 0;

    pHead->pNext = NULL;

    return pHead;
}

/*************************************************
Function      : FindNodeByGlobalIndex
Description   : 根据指定参数,查找某个节点
Input         : pHead 链表的头节点指针
                要查找的学生ID
Return        : 正确:返回指定节点的指针
                失败:返回空指针
*************************************************/
Node* FindNodeByGlobalIndex(Node *pHead, int iGlobalIndex)
{
    Node *pNode = NULL;

    if ((NULL == pHead) || (iGlobalIndex < 0))
    {
        return NULL;
    }

    pNode = pHead->pNext;
    while ((NULL != pNode))
    {
        if (pNode->data.a == iGlobalIndex)
        {
            break;
        }
        pNode = pNode->pNext;
    }

    return pNode;
}

/*************************************************
Function      : Insert2ListTail
Description   : 向链表中尾部插入某个节点
Input         : pHead        链表的头节点指针
                pStudentInfo 学生信息
Return        : 正确:返回头节点指针
                失败:返回空指针
*************************************************/
Node* Insert2ListTail(Node *pHead, Node_data  *pAutoInfo)
{
    Node* pNode = NULL;
    Node* pNewNode = NULL;

    if ((NULL == pHead) || (NULL == pAutoInfo))
    {
        return NULL;
    }

    pNode = pHead;
    while (pNode->pNext != NULL)
    {
        pNode = pNode->pNext;
    }

    pNewNode = (Node *)malloc(sizeof(Node));
    if (NULL == pNewNode)
    {
        return NULL;
    }

    pNode->pNext = pNewNode;
    pNewNode->pNext = NULL;
    memcpy(&(pNewNode->data), pAutoInfo, sizeof(Node_data ));

    return pHead;
}

/*************************************************
Function      : RemoveList
Description   : 删除整个链表
Input         : pHead 链表的头节点指针
Return        : 正确: 1
                失败: 0
*************************************************/
int RemoveList(Node *pHead)
{
    Node *pNode = NULL;
    Node *pb = NULL;

    if (NULL == pHead)
    {
        return 0;
    }

    pNode = pHead;
    pb = pNode->pNext;

    if (NULL == pb)
    {
        free(pNode);
    }
    else
    {
        while (NULL != pb)
        {
            free(pNode);
            pNode = pb;
            pb = pb->pNext;
        }
        free(pNode);
    }

    pNode = NULL;

    return 1;
}

/*************************************************
Function      : PrintList
Description   : 打印整个链表
Input         : pHead 链表的头节点指针
Return        :
*************************************************/
void  PrintList(Node *pHead)
{
    Node *pNode = NULL;

    if (NULL == pHead)
    {
        return ;
    }

    pNode = pHead->pNext;
    while ((NULL != pNode))
    {
        printf("\r\n a is %d   b is  %d",pNode->data.a,pNode->data.b);
        pNode = pNode->pNext;
    }

    return ;
}

/*************************************************
Function      : DeleteList
Description   : 删除链表的一个结点,删除条件该节点的a值与x相同
Input         :
Return        :
*************************************************/
int DeleteList (Node *pHead,int x)
{
    Node *pNode = NULL;
    Node *pre = NULL;

    if (NULL == pHead  )
    {
        return 0;
    }
    pNode = pHead->pNext;
    pre = pHead;

    while(pNode)
    {
        if(pNode->data.a == x)//删除条件
        {
            pre->pNext = pNode->pNext;
            free(pNode);
            return 1;
        }
        else
        {
            pre = pNode;
        }
        pNode = pNode->pNext;
    }

    return 0;
}

/*************************************************
Function      : ReverseList
Description   : 链表反转
Input         :
Return        :
*************************************************/
void ReverseList(Node *pHead)
{
    Node* p = pHead->pNext;
    Node* q = p->pNext;
    Node* t = NULL;
    if(NULL == pHead || NULL == pHead->pNext)
    {
        return;
    }
    while(NULL != q)
    {
        t = q->pNext;
        q->pNext = p;
        p = q;
        q = t;
    }
    pHead->pNext->pNext = NULL;
    pHead->pNext = p;
}

/*************************************************
Function      : SortList
Description   : 按a值排序
Input         :
Return        :
*************************************************/
void SortList(Node *pHead)
{
    Node* pi = pHead->pNext;
    Node* pj = pi->pNext;
    Link_data temp;
    memset(&temp,0,sizeof(Link_data));

    if(NULL == pHead  || NULL == pHead->pNext)
    {
        return;
    }

    for(;pi != NULL;pi=pi->pNext)
    {
        for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
        {
            if(pj->data.a < pi->data.a)
            {
                temp = pj->data;
                pj->data = pi->data;
                pi->data = temp;
            }
        }
    }
}
#include<stdio.h>
#include<string.h>
#include"list.h"

Node * g_LinkHead = NULL;

int main()
{
    Node_data data1;
    Node_data data2;
    Node_data data4;
    Node *data3 = NULL;
    memset(&data1, 0, sizeof(Node_data));
    memset(&data2, 0, sizeof(Node_data));
    memset(&data4, 0, sizeof(Node_data));

    data1.a=3;
    data1.b=3;
    data2.a=2;
    data2.b=4;
    data4.a=5;
    data4.b=6;

    g_LinkHead=CreateList();

    Insert2ListTail(g_LinkHead,&data1);
    Insert2ListTail(g_LinkHead,&data2);
    Insert2ListTail(g_LinkHead,&data4);

    PrintList(g_LinkHead);

    //data3 = FindNodeByGlobalIndex(g_LinkHead, 2);
    //printf("\r\n data3.a %d data3.b %d",data3->data.a,data3->data.b);
    printf("\n\n");
    //(void) ReverseList(g_LinkHead);
    (void) SortList(g_LinkHead);
    PrintList(g_LinkHead);
    /*if(DeleteList (g_LinkHead,4))
    {
        PrintList(g_LinkHead);
    }
    PrintList(g_LinkHead);*/
    /*if(RemoveList(g_LinkHead))
    {
        g_LinkHead = NULL;
    }

    PrintList(g_LinkHead);*/

    return 0;
}
时间: 2024-10-10 16:02:17

带有头结点的链表的基本操作的相关文章

有头结点的链表操作

#include<iostream> #include <stack> using namespace std; struct Node { int data; Node *next; }; //没有头结点的插入新节点 Node* AddNode(Node *head,int num)//如果是void 类型的 那么head要用指向指针的指针 { Node *pNew=(Node*)malloc(sizeof(Node)); pNew->data=num; pNew->

使用只有头结点的链表实现栈

使用静态内部类充当单链表 1 package db; 2 3 /** 4 * 只有头结点实现栈 5 * 6 * @author fightzhao 7 * 8 */ 9 public class Stack<E> { 10 /* 11 * 有以下方法 入栈 push(E x) 出栈pop() 栈顶元素top() 12 */ 13 private static class Node<E> { 14 public Node<E> next; 15 public E data

设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。(利用上篇带有头结点的线性链表操作)

#include <stdio.h>#include <malloc.h>typedef int DataType;#include "LinList.h" void main(){ SLNode *head_A,*head_B,*c,*pa,*pb,*pc; int i,j,x; ListInitiate(&head_A);//初始化链表a ListInsert(head_A,0,1);//a递增链表 ListInsert(head_A,1,3); L

2.8~2.12带头节点的链表的基本操作

2.8和2.9在带头结点的链表中实现插入和获取元素的操作 #include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; Status

线性表带头结点的单链表的链式表示和实现

带有头结点的单链表的12个基本操作 #define DestroyList ClearList//DestroyList()和ClearList()的操作是一样的 void InitList(LinkList &L){ L = NULL; } void ClearList(LinkList &L){ LinkList p; while (L){ p = L; L = L->next; free(p); } } Status ListEmpty(LinkList L){ if (L)r

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点.链表结点定义如下: struct ListNode { int       m_nKey; ListNode* m_pNext; }; c语言实现 /* File : rlink.c Author : Date : 2015/4/4 platform : windows7 x86_64 version : 1.0 Function : 反转一个链表 */ #include <stdio.h> #include <stdli

链表的基本操作(不带头结点)

首先声明一个结构体类型,包含数据域和指针域. typedef struct student { int num; char name[20]; struct student *next; }Student; 第二步是创建一个不含头结点的链表 Student *Create_stu(int n) //n为创建链表的元素个数 { Student *head,*tail,*p; //head为首节点,tail为尾节点 int num,i; char name[20]; head=tail=NULL;

浅谈单链表有头结点和无头节点

有头结点的链表统一了算法的实现,无头节点减少了节点个数,但是只有根据实际情况选用真正的有无头节点链表 待续://代码实现 待续://代码实现 待续://代码实现

链表----在链表中添加元素详解--使用链表的虚拟头结点

在上一小节中关于在链表中头部添加元素与在其他位置添加元素在逻辑上有所差别,这是由于我们在给链表添加元素时需要找到待添加元素位置的前一个元素所在的位置,但对于链表头来说,没有前置节点,因此在逻辑上就特殊一些,操作方式也就有所差别,需单独处理.为了针对头结点的操作方式与其他方式一致:接下来我们就一步一步引入今天的主题--使用虚拟头结点. 首先来看看之前的节点结构--第一个是头结点 相应的逻辑代码,感兴趣的可以看看我上一篇相关介绍,点击传送地址 为了能把关于头结点的操作与其他操作统一起来,我们来分析一