单链表C语言实现(带头节点)

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

typedef int ElemType;

typedef struct LinkNode
{
    ElemType data;
    struct LinkNode *next;
}LinkNode, *LinkList;

LinkList InitNull();
LinkList InitListByHeadInsert();
void PrintList(LinkList L);
LinkList InitListByTailInsert();
int Len(LinkList L);
int GetElem(LinkList L, int index, ElemType *X);
int InsertNode(LinkList L, int index, ElemType data);
int DeleteNode(LinkList L, int index, ElemType *X);
void Reverse(LinkList L);

int main()
{

}

//建立空链表
LinkList InitNull()
{
    LinkList L = malloc(sizeof(LinkNode));
    L->next = NULL;
    return L;
}

//头插法建立单链表
LinkList InitListByHeadInsert()
{
    int data;
    LinkList temp;
    LinkList L = malloc(sizeof(LinkNode));
    L->next = NULL;
    printf("请输入数字,-1结束:");
    scanf("%d", &data);
    while(data != -1)
    {
        temp = malloc(sizeof(LinkNode));
        temp->data = data;
        temp->next = L->next;
        L->next = temp;
        printf("\n请继续输入数字,-1结束:");
        scanf("%d", &data);
    }
    return L;
}

//尾插法建立单链表
LinkList InitListByTailInsert()
{
    int data;
    LinkList temp, tail;
    LinkList L = malloc(sizeof(LinkNode));
    tail = L;
    L->next = NULL;
    printf("请输入数字,-1结束:");
    scanf("%d", &data);
    while(data != -1)
    {
        temp = malloc(sizeof(LinkNode));
        temp->data = data;
        temp->next = tail->next;
        tail->next = temp;
        tail = temp;
        printf("\n请继续输入数字,-1结束:");
        scanf("%d", &data);
    }
    return L;
}

//获取链表中第i个元素的值,用X接受,返回1代表操作成功,0代表失败 ,链表中的索引从0开始
int GetElem(LinkList L, int index, ElemType *X)
{
    LinkList temp = L->next;
    int i = 0;
    if(index < 0)
    {
        printf("索引位置非法!\n");
        return 0;
    }
    while(temp != NULL && i < index)
    {
        temp = temp->next;
        i++;
    }
    if(temp == NULL)
    {
        printf("索引位置非法!\n");
        return 0;
    }
    else
    {
        *X = temp->data;
        return 1;
    }
}

//在链表中插入一个值,index表示元素插入后的位置,索引从0开始,返回1表示操作成功,0表示失败
int InsertNode(LinkList L, int index, ElemType data)
{
    if(index < 0)
    {
        printf("插入位置非法!\n");
        return 0;
    }

    LinkList Ptr = L;
    LinkList temp = NULL;
    int i = 0;

    while(Ptr != NULL && i < index)
    {
        Ptr = Ptr->next;
        i++;
    }

    if(Ptr == NULL)
    {
        printf("插入位置非法!\n");
        return 0;
    }
    else
    {
        temp = malloc(sizeof(LinkNode));
        temp->data = data;
        temp->next = Ptr->next;
        Ptr->next = temp;
    }
}

//从链表中插入一个值,index表示元素的位置,索引从0开始,返回1表示操作成功,0表示失败,返回元素的值存在X中
int DeleteNode(LinkList L, int index, ElemType *X)
{
    if(index < 0)
    {
        printf("删除位置非法!\n");
        return 0;
    }

    LinkList Ptr = L;
    LinkList temp = NULL;
    int i = 0;

    while(Ptr != NULL && i < index)
    {
        Ptr = Ptr->next;
        i++;
    }

    if(Ptr == NULL || Ptr->next == NULL)
    {
        printf("删除位置非法!\n");
        return 0;
    }
    else
    {
        temp = Ptr->next;
        *X = temp->data;
        Ptr->next = temp->next;
        free(temp);
    }
}

//单链表的逆置 

void Reverse(LinkList L)
{
    LinkList CurrentNode = L->next;
    LinkList NextNode = NULL;
    L->next = NULL;

    while(CurrentNode != NULL)
    {
        NextNode = CurrentNode->next;
        CurrentNode->next = L->next;
        L->next = CurrentNode;
        CurrentNode = NextNode;
    }
}

//求链表的长度
int Len(LinkList L)
{
    LinkList temp = L->next;
    int len = 0;
    while(temp != NULL)
    {
        len++;
        temp = temp->next;
    }
    return len;
}

//打印链表中的元素
void PrintList(LinkList L)
{
    LinkList temp = L->next;
    while(temp != NULL)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}
时间: 2024-10-13 20:15:21

单链表C语言实现(带头节点)的相关文章

删除单链表中第i个节点

单链表的删除操作是将单链表的第i个节点删去.具体步骤如下: (1)找到节点ai-1的存储位置p,因为在单链表中节点ai的存储地址是在其直接前趋节点ai-1的指针域next中: (2)令p->next指向ai的直接后继节点ai+1: (3)释放节点ai的空间: #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } NODE; // 尾插法创建单链表(

栈和队列----将单链表的每K个节点之间逆序

将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1->2->3->4->5->6->7->8->null,k=3. 调整好后:3->2->1->6->5->4->7->8->null,其中7.8不调整,因为不够一组. [解析] 1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的

带头节点的单链表-------C语言实现

1 /***************************************************** 2 Author:Simon_Kly Version:0.1 Date:20170520 3 Description:带头接点的单链表 4 Mail:[email protected] 5 Funcion List: 6 *****************************************************/ 7 8 #include <stdio.h> 9 #

【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

所实现的循环单链表的结构如下图所示: 循环单链表的实现,和上一篇文章单链表的实现大致相同点击打开链接,略有区别: 1:循环判断的条件不再是s == NULL或者s->next == NULL,而是他们是否等于头指针.2: 断开链表时的处理,尾节点的next不是NULL,而是指向头结点 具体细节参考上一篇文章 头文件:SCList.h #ifndef SCLIST_H #define SCLIST_H #include<iostream> #include<cassert> u

【c++版数据结构】之单链表的实现(带头结点以及尾节点)

所实现的单链表的结构如下图所示: 头文件:SList.h #include<iostream> #include<cassert> using namespace std; typedef enum{FALSE,TRUE}Status; template<class Type> class List; template<class Type> class ListNode { friend class List<Type>; //友元类可以访问该

JAVA单链表的实现-不带头结点且没有尾指针

本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java

Java-找出两个单链表的首个公共节点

单链表中的简单算法 /** * 得到两个单链表的公共结点 * 先求出两个链表的长度,并求出二者的差值dif,两个指针分别指向链表头部,让指向长的链表的指针先向链表尾部移动dif步. * 最后一起一步步移动两个指针,当两个指针都指向同一个结点时,返回那个结点 * @param list1 * @param list2 * @return */ public static ListNode getFirstCommonNode(ListNode list1,ListNode list2){ if(l

单链表倒数第K个节点的查找和显示

1.使用一个固定长度队列装链表段,当遍历到链表根时,返回队列头元素. class Node{ int value; Node next; public Node(int value){ this.value=value; } } public class Danlianbiao { public static void main(String[] args) { Node node=new Node(1); Node node2=node.next=new Node(2); Node node3