数据结构与算法(单链表)c版实现

数据结构与算法(单链表)

  • 作者:墙角黑猫
  • 时间:2020.03.26

#本人只是一个知识浅薄的初学者,这也是第一次写自己的代码博客,出于对计算机的兴趣,自己 在看数据结构的教学视频(小甲鱼的)。所以想在学习的过程中用自己所学到的加上一丢丢的自己组织总结每一阶段的学习成果,如果对像我一样同样是初学者的你有所帮助的话甚是开心,如果有大佬路过有建议的话希望可以提出,小编定会认真思考改进!!

#那我废话不再说了直奔主题,直接上代码!

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

#define ERROR 0;
#define OK 1;

typedef int Status;
typedef int ElemType;

typedef struct Node
{
    ElemType data;
    struct Node* next;
}Node;

typedef struct  Node* LinkList;

Status InitList(LinkList *L)
/*初始化带头节点的的空链表*/
{
    *L = (LinkList)malloc(sizeof(Node));
    if(!(*L))
    {
        return ERROR;
    }
    (*L) -> next = NULL;
    return OK;
}

void CreateListHead(LinkList *L, int n)
/*头插法创建单链表*/
{
    LinkList p;
    int i;
    srand(time(0));
    for( i=0; i < n; i++ )
    {
        p = (LinkList)malloc(sizeof(Node));
        p -> data = rand()%100 + 1;
        p -> next = (*L) -> next;
        (*L) -> next = p;
    }
}

Status ListLength(LinkList L)
/*链表长度*/
{
    int i = 0;
    LinkList p = L -> next;
    while(p)
    {
        i++;
        p = p -> next;
    }
    return i;
}

Status ClearList(LinkList *L)
/*清除单链表,释放内存*/
{
    LinkList p, q;
    p = (*L) -> next;
    while(p)
    {
        q = p -> next;
        free(p);
        p = q;
    }
    (*L) -> next = NULL;
    return OK;
} 

Status GetElem( LinkList L, int i,ElemType *e)
/*获取元素*/
{
    int j;
    LinkList p;
    p = L -> next;
    j = 1;
    while(p && j<i)
    {
        p = p -> next;
        ++j;
    }
    if(!p || j >i || i > ListLength(L))
    {
        return ERROR;
    }
    *e = p -> data;
    return 0;
}

Status GetList(LinkList L)
/*获得单链表全体成员*/
{
    int i = 1;
    int m;
    LinkList p;
    p = L ->next;
    while (p && i < ListLength(L))
    {
        m = p ->  data;
        printf("%d\t",m);
        p = p -> next;
    }
    
}

Status ListDelete(LinkList *L, int i)
/*删除元素*/
{
    int j;
    LinkList p,q;
    p = *L;
    j = 1;
    while(p -> next && j<i)
    {
        p = p -> next;
        ++j;
    }
    if (!(p -> next) || j>i || i > ListLength(*L))
    {
        return ERROR;
    }
    q = p -> next;
    p -> next = q -> next;
    free(q);
    GetList(*L);
    return OK;
}

Status Lisinsert(LinkList *L, int i, ElemType e)
/*插入元素*/
{
    int j;
    LinkList p,q;
    p = *L;
    j = 1;
    while (p && j < i)
    {
        p = p -> next;
        ++j;
    }
    if (!p || j > i || i > (ListLength(*L) + 1))
    {
        return ERROR;
    }
    q = (LinkList)malloc(sizeof(Node));
    q ->data = e;
    q ->next = p -> next;
    p -> next = q;
    GetList(*L);
    return OK;
}

int main()
{
    LinkList L;
    Status i,n,m;
    char opp;
    ElemType *e;
    
    *e = (int)malloc(sizeof(int));
    i = InitList(&L);
    printf("初始化L后:ListLength(L) = %d\n", ListLength(L));
    printf("\n1.创建单链表(头插法)  \n2.单链表长度  \n3.获取第几位链表元素  \n4.清空链表  \n5.获得单链表 \n");
    printf("6.删除元素 \n7.插入元素\n0.推出\n\n");
    scanf("%c",&opp);
    while(opp != '0')
    {  
        switch (opp)
        {
        case '1':
            printf("你要创建几位链表?\n");
            scanf("%d",&m);
            CreateListHead(&L,m);
            printf("成功创建单链表\n");
            printf("\n\n");
            break;
        case '2':
            printf("链表长度为 = %d。\n", ListLength(L));
            printf("\n\n");
            break;
        case '3':
            printf("请问获取第几个元素?\n");
            scanf("%d", &n);
            GetElem(L,n, e);
            printf("链表第%d位是元素:%d\n",n,*e);
            printf("\n\n");
            break;
        case '4':
            ClearList(&L);
            printf("链表以清空\n");
            printf("\n\n");
            break;
        case '5':
            GetList(L);
            printf("\n\n\n");
            break;
        case '6':
            printf("小姐姐,你要删除第几为元素?\n");
            scanf("%d",&n);
            ListDelete(&L, n);
            printf("\n\n");
            break;
        case '7':
            printf("小姐姐,你要在第几位插入元素呢?\n");
            scanf("%d",&n);
            printf("小姐姐,你要插入什么元素呢?\n");
            scanf("%d",&m);
            Lisinsert(&L, n, m);
            printf("\n\n");
            break;
        case '0':
            free(e);
            exit(0);
        }
        scanf("%c",&opp);
    }
}

代码有点零乱,小编实在是实力有限,多多包含,会努力提升。如果你喜欢的话我会在学习过程中继续更新,希望大家多多支持,多多给小编指明学习的方向,本人定当感激不尽!!

链接: Github连接.
链接: 本文连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值