码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-12-16 01:38:31      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

#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");
}

 

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

标签:

原文地址:http://www.cnblogs.com/guyueyue/p/5049977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!