每天一个数据结构-----线性表的链式(单链表)存储结构

版权声明:原创文章,转载请注明原文地址。 https://blog.csdn.net/it_r00t/article/details/79859094
//

//  main.c

//  LinkList

//

//  Created by Jacobs.Guo on 2018/4/3.

//  Copyright © 2018年 yage guo. All rights reserved.

//



#include <stdio.h>

#include <stdlib.h>

#include <time.h>



#define ERROR 0

#define OK    1

#define TRUE  1

#define FALSE 0



typedef int  ElemType;

typedef int status;

typedef struct Node

{

    ElemType data;

    struct Node *next;

} Node;

typedef struct Node *LinkList;

//单链表的整表创建(头插法)

//param:LinkList *L 没有任何节点的单链表

//Param:int n   整数N,代表插入节点的个数

void CreateListHead(LinkList *L,int n)

{

    LinkList q;int i;

    *L = (LinkList)malloc(sizeof(Node));

    (*L)->next = NULL;//构建头结点

    

//    srand((unsigned)time(NULL));

    for (i = 0;i<n;i++)

    {

        q = (LinkList)malloc(sizeof(Node));

//        q->data = rand() % 101;

        q->data = (i+1)*10;

        q->next = (*L)->next;

        (*L)->next = q;

    }

}

//单链表的整表创建(尾插法)

void CreateListTail(LinkList *L,int n)

{

    LinkList q,r;int i;

    *L = (LinkList)malloc(sizeof(Node));

    (*L)->next = NULL;

    r = *L;

    

    for (i = 0;i<n;i++)

    {

        q = (LinkList)malloc(sizeof(Node));

        q->data = (i+1)*10;

        r->next = q;

        r = q;

    }

    r->next = NULL;

}

//单链表的整表删除

status ClearList(LinkList *L)

{

    LinkList p,q;

    p = (*L)->next;

    while (p)

    {

        q = p->next;

        free(p);

        p = q;

    }



    return OK;

}

//删除单链表的第I个节点

status ListDelete(LinkList *L,int position)

{

    LinkList p,q;int i=1;

    p = (*L)->next;

    while (p->next && ((i++)<position-1))

    {

        p = p->next;

    }

    if ((!p->next) || position > i) return ERROR;

    q = p->next;

    p->next = q->next;

    free(q);

    

    return OK;

}



//单链表的插入操作,在第position个位置上插入元素e

status InsertList(LinkList *L,int position,ElemType e)

{

    LinkList p,q;int i=1;

    p = *L;

    while (p->next && (i++)<position)

    {

        p = p->next;

    }



    if (i < position) return ERROR;

    

    q = (LinkList)malloc(sizeof(Node));

    q->data = e;

    q->next = p->next;

    p->next = q;

    

    return OK;

}

status visit(ElemType c)

{

    printf("%d ",c);

    return OK;

}

// 依次对L的每个数据元素输出

status ListTraverse(LinkList L)

{

    LinkList p=L->next;

    while(p)

    {

        visit(p->data);

        p=p->next;

    }

    printf("\n");

    return OK;

}

int main() {

    LinkList L,La;

    printf("使用头插法顺序插入节点数据域为10、20、30、40、50之后的单链表L:\n");

    CreateListHead(&L, 5);

    ListTraverse(L);

    

    printf("使用尾插法顺序插入节点数据域为10、20、30、40、50之后的单链表L:\n");

    CreateListTail(&La, 5);

    

    ListTraverse(L);

    

    if (ClearList(&La)) printf("La表已经清空\n");

    printf("\n");

    printf("删除单链表L的第2个节点之后单链表的数据为:\n");

    ListDelete(&L, 2);

    ListTraverse(L);

    

    

    printf("在单链表L的第2个位置添加数据域为100的节点之后:\n");

    InsertList(&L, 2, 100);

    ListTraverse(L);

    ClearList(&L);

    

    return 0;

}

猜你喜欢

转载自blog.csdn.net/it_r00t/article/details/79859094