线性表之单链表

对比了好几本书,比较少涉及单链表的赋值,为了亲自跑出其他功能,花了不少时间,毕竟是打基础嘛,相信以后会越来熟练(你为什么那么熟练^ ^)话不多说,下面是代码及实验结果。
 


这里写图片描述
#include <cstdio>
#include <cstdlib>
#define  ElementType int
#define MAXSIZE 1000
#define ERROR -1


/*线性表-顺序表-结构体定义*/
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;                                       /*最后一个位置下标,用来计算顺序表的长度*/
};
struct LNode L;
PtrToLNode PtrL = &L;



/*初始化-赋值*/
PtrToLNode CreatNewList(PtrToLNode PtrL , int data){
    PtrToLNode q = PtrL;
    PtrToLNode p = (PtrToLNode)malloc(sizeof(struct LNode));
    p->Next = NULL;
    p->Data = data;
    if( NULL == PtrL ){
        PtrL = p;
    }
    else{
        while(q->Next)
            q = q->Next;
        q->Next = p;
    }
    return PtrL;
}

/*遍历-打印*/
int ShowNewList(PtrToLNode PtrL ){
    PtrToLNode p = PtrL;
    while(p){
        printf("%d",p->Data);
        p = p->Next;
    }
    printf("\n");
    return 1;
}

/*遍历-求表长*/
int Length(PtrToLNode PtrL){
    PtrToLNode p = PtrL;    /*p指向表第一个节点*/
    int j = 0;
    while(p){
        p = p->Next;
        j++;    /*此时p指向第j个节点*/
    }
    return j;
}





/* 按序查找 */
/* 查找第K个数,并返回其值的指针 */
PtrToLNode FindKth( int K, PtrToLNode PtrL )
{   PtrToLNode p = PtrL;    /*p指向表第一个节点*/
    int i = 1;
    while( p != NULL && i < K ){
        p = p->Next;
        i++;
    }
    if ( i == K )  return p;    /* 如果找到,返回指针 */
    else  return NULL;
}
/* 按值查找 */
/* 查找X,并返回其值位置 */
int Find( int X, PtrToLNode PtrL )
{   PtrToLNode p = PtrL;    /*p指向表第一个节点*/
    int j = 1;
    while( p != NULL && p->Data != X ){
        p = p->Next;
        j++;
    }
    return j;
}


/* 插入 */
/* 必须知道前一个节点才能插入 */
PtrToLNode Insert( PtrToLNode PtrL, ElementType X, int i )
{
    PtrToLNode p,s;
    if(i == 1){ //第一个节点特殊处理
        s = (PtrToLNode)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = PtrL;
        return s;
    }
    p = FindKth(i-1,PtrL);
    if(p == NULL){
        printf("参数i错误");
        return NULL;
    }
    else{
        s = (PtrToLNode)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = p->Next;
        p->Next = s;
        return PtrL;
    }
}

/* 删除 */
/* 必须知道前一个节点才能删除 */
PtrToLNode Delete( PtrToLNode PtrL, int i){
    PtrToLNode p,s;
    if(i == 1){  //第一个节点特殊处理
        s = PtrL;
        if(PtrL != NULL) PtrL = PtrL->Next; //链跳过第一个节点
        else return NULL;
        free(s);
        return PtrL;
    }
    p = FindKth(i-1,PtrL);
    if(p == NULL){
        printf("第 %d 个结点不存在",i-1); return NULL;
    }
    else if(p->Next == NULL){
        printf("第 %d 个结点不存在",i-1); return NULL;
    }
    else{
        s = p->Next;
        p->Next = s->Next;  //跳过s
        free(s);
        return PtrL;
    }
}

void DestoryList( PtrToLNode PtrL )
{
        PtrToLNode p;

        if(PtrL == NULL)
                return;

        while(PtrL)
        {
                p = PtrL;
                PtrL=PtrL->Next;
                free(p);
        }
}



int main()
{
    int i,l,n,x,K,j,X;
    int m,M,d;
    PtrToLNode PtrL,find1,find2;
    scanf("%d",&n);
    for(i = 0; i < n; i++){
        scanf("%d",&x);
        PtrL = CreatNewList(PtrL , x);
    }
    l = Length(PtrL);
    printf("Length = %d \n",l);
    ShowNewList(PtrL);

    printf("Find Kth number, input K :");
    scanf("%d",&K);
    find1 = FindKth( K,  PtrL );
    printf("Kth = %d\n",find1->Data);

    printf("Find a number, input number :");
    scanf("%d",&X);
    j = Find( X, PtrL );
    printf("%d is in the %d th position\n", X,j);

    printf("insert m in M ,input m M :");
    scanf("%d %d",&m,&M);
    PtrL = Insert( PtrL,  m,  M );
    ShowNewList(PtrL);

    printf("delete d th number, input d :");
    scanf("%d",&d);
    PtrL = Delete( PtrL, d);
    ShowNewList(PtrL);

    DestoryList(PtrL);



    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容