单链表的C实现及演示

    最近在认真学习数据结构,唉,落下的总是还要捡起来啊。结合的《算法导论》(这本书可真难看啊)和《数据结构与算法分析》这两本书。

看完之后觉得自己好像懂了,但是根据之前的经验,一般这样都是没懂了,看完一段内容之后竟然没有问题,那就肯定是还没完全理解;

因此就想着闭着眼睛把书上的例程实现一遍。果然,在实践过程中其路途之坎坷,加深了对其的了解。

struct Node
{
    ElementType Element;
    Position          Next;
};

这是书上给出的链表的结构,存着这个Node的元素跟指向下一个元素的指针。

typedef struct Node  *PtrToNode
typedef PtrToNode List
type PtrToNode Position


刚开始很想不同List 跟 Position不是一个东西么,为什么要定义两次。其实我觉得可以理解为一静一动,便于区分。

书中定义了查找、插入等函数,自己复写的过程中,稍微有问题的就删除元素。

先找到要删除元素的前一个元素P,将P->Next即待删除的元素复制给tmp,再将tmp->Next赋值给p->Next使其指向待删除元素的下一个元素,然后free(Tmp),当时以为free是将tmp处的内存释放给系统,后面讲到free是tmp指向的地址没变,但该地址出的数据已无定义了。

还有就是表头的理解,表头可以解决记录前面表元这个问题,我觉得可以看作是链表的数组名,它是一个静态的。

在实现MakeEmpty时,一直想不通L的element应该是什么,当然现在还是不是很理解,所以Make一个空表就只是malloc获取新单元赋予L,L->Next = NULL ,完全没有考虑L的element,不过,既然大家都没考虑,那应该是没什么意义。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"list.h"
#include"fatal.h"
struct Node
{
    ElementType Element;
    Position Next;
};
void main()
{
    List L;
    L = MakeEmpty();
    Position CuruntP = L;
    Position TemCell;
    int i, num;
    srand(time(NULL));
    for(i=0;i<10;i++)
    {
       TemCell = malloc(sizeof(struct Node));
       if(TemCell == NULL)
           FatalError("OUt of space!");
       CuruntP->Next = TemCell;
       TemCell->Element = rand()%100+1;
       TemCell->Next = NULL;
       CuruntP = TemCell;
    }
    ShowList(L);
    printf("Let's delete one element,please input a element in list \n");
    int x;
    scanf("%d",&x );
    Delete(x, L);
    ShowList(L);
    printf("Let's find one element,please input a element in list \n");
    scanf("%d",&x );
    Position des;
    des = Find(x, L);
    printf("Let's insert one element,please input a element in list \n");
    scanf("%d", &x);
    Insert(x, L, des);
    ShowList(L);
}

然后我觉得不直观,就自己初始化了一个链表然后对其进行一系列操作,很简单,但是利于理解。

对于其应用多项式和基排序,虽然代码都给出来了,还是想哪天自己 闭着眼睛实现一下,实践出真知嘛。

对于以上内容,若有大神指正感激不尽,尽管使劲拍。

哈哈,对了,为了熟悉github操作,我还push上去了,额..不过我觉得真用github的大神估计完全不会理睬我这小虾米,不过我还是要贴上来,我所展露的无知越多,说明我进步的空间越大,只要我肯努力。

对,这就是github链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值