线性表的链式存储结构(单链表 C语言版)

LinkList.h

#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

/*线性表的单链表存储结构*/
typedef struct Node
{
    ElemType data;
    struct Node *next;
}node;
typedef struct Node *LinkList;

Status InitLink(LinkList L);/*初始化单链表*/
Status CreateLink(LinkList L, int n);/*单链表的整表创建*/
int LengthLink(LinkList L);/*求单链表的长度*/
Status GetElem(LinkList L, int i, ElemType *e);/*得到单链表的元素*/
Status LinkInsert(LinkList L, int i, ElemType e);/*单链表的插入*/
Status LinkDelete(LinkList L, int i, ElemType *e);/*单链表的删除*/
Status PrintLink(LinkList L);/*打印单链表*/
Status ClearLink(LinkList L);/*单链表的整表删除*/
Status NixuLink(LinkList L);/*单链表的逆序*/

Linklist.c

#include "LinkList.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

Status InitLink(LinkList L)
{
    L = (LinkList)malloc(sizeof(node));
    if(!L)
    {
        return ERROR;
    }
    memset(L, 0, sizeof(node));
    
    L->next = NULL;
    
    return OK;
}

Status CreateLink(LinkList L, int n)
{
    int i = 0;
    LinkList r = NULL, p = NULL;
    InitLink(L);
    r = L;
    
    for(i=0; i<n; i++)
    {
        p = (LinkList)malloc(sizeof(node));
        if(!p)
        {
            return ERROR;
        }
        memset(p, 0, sizeof(node));
        p->data = i+1;
        
        r->next = p;
        r = p;
    }
    r->next = NULL;
    return OK;
}

int LengthLink(LinkList L)
{
    LinkList r = L;
    int len = 0;
    while(r->next)
    {
        r=r->next;
        len++;
    }
    return len;
}

Status GetElem(LinkList L, int i, ElemType *e)
{
    int j = 0;
    LinkList r = L;
    
    while(r->next && j<i)
    {
        r = r->next;
        j++;
    }
    
    if(!r || i<1)
    {
        return ERROR;
    }
    
    *e = r->data;
    
    return OK;
}

Status LinkInsert(LinkList L, int i, ElemType e)
{
    int j = 0;
    LinkList r = NULL, p = NULL;
    r = L;
    
    if(i<1 || i>LengthLink(L)+1)
    {
        return ERROR;
    }
    for(j=1; j<i; j++)
    {
        r = r->next;
    }
    
    p = (LinkList)malloc(sizeof(node));
    if(!p)
    {
        return ERROR;
    }
    memset(p, 0, sizeof(node));
    p->data = e;
    
    p->next = r->next;
    r->next = p;
    
    return OK;
    
}

Status LinkDelete(LinkList L, int i, ElemType *e)
{
    int j = 0;
    LinkList r = NULL, p = NULL;
    r = L;
    
    if(i<1 || i>LengthLink(L))
    {
        return ERROR;
    }
    
    for(j=1; j<i; j++)
    {
        r = r->next;
    }
    p = r->next;
    *e = p->data;
    
    r->next = p->next;
    
    free(p);
}

Status ClearLink(LinkList L)
{
    LinkList r = NULL, p = NULL;
    r = L->next;
    while(r)
    {
        p = r->next;
        free(r);
        r = p;
    }
    L->next = NULL;
    
    return OK;
}

Status PrintLink(LinkList L)
{
    LinkList r = L;
    while(r->next)
    {
        r = r->next;
        printf("%d ", r->data);
    }
    printf("\n");
}
/*循环迭代逆序*/
Status NixuLink(LinkList L)
{
    /*通过三个指针来实现*/
    static LinkList prev = NULL;
    LinkList head = NULL, next = NULL;
    head = L->next;
    //next = head->next;
    L->next = NULL;
    
    while(head)
    {
        next = head->next;
        head->next = prev;
        prev = head;
        head = next;
    }
    /*
    while(prev)
    {
        printf("%d ", prev->data);
        prev = prev->next;
    }
    printf("\n");
    */
    
    L->next = prev;
    //printf("%d\n", L->next->next->data);
    
    return OK;
}

猜你喜欢

转载自blog.csdn.net/weixin_41778615/article/details/89226459