1. 程式人生 > >每天一個數據結構-----線性表的鏈式(單鏈表)儲存結構

每天一個數據結構-----線性表的鏈式(單鏈表)儲存結構

//

//  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;

}