数据结构笔记:线性表链式存储结构

存在头结点(不存放任何数据)的链表。

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

typedef int ElemType;

typedef struct Node//链表节点
{
    ElemType data;//链表数据
    struct Node *next;//链表指针,用来指向下一个节点
}Node;


/*void InitList(Node **P)//建立一个头结点,并初始化链表,头插法
{
    int n,i;
    Node *Q;
    (*P) = (Node*)malloc(sizeof(Node));
    (*P)->next = NULL;
    printf("请输入链表的长度:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        Q = (Node*)malloc(sizeof(Node));
        printf("请输入数据:");
        scanf("%d",&Q->data);
        Q->next = (*P)->next;
        (*P)->next = Q;
    }
}*/

void InitList(Node **P)//尾插法
{
    int n,i;
    Node *Q,*R;
    (*P) = (Node *)malloc(sizeof(Node));
    (*P)->data = 1;
    (*P)->next = NULL;
    R = (*P);
    printf("请输入 链表的长度:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        Q = (Node *)malloc(sizeof(Node));
        printf("请输入数据:");
        scanf("%d",&Q->data);
        R->next = Q;
        R = Q;
    }
    R->next = NULL;
}

void ListInsert(Node **L)//插入节点
{
    int n,m=1;
    printf("请输入插入的位置:");
    scanf("%d",&n);
    Node *Q,*P=(*L);
    Q = (Node*)malloc(sizeof(Node));
    printf("请输入插入的内容:");
    scanf("%d",&Q->data);
    while(P && m<n)
    {
        P = P->next;
        m++;
    }
    if(!P || m>n)
    {
        printf("插入位置异常,插入失败!\n");
        return ;
    }
    Q->next = P->next;
    P->next = Q;

}

void ListDelete(Node **L)//删除节点
{
    int n,m=1;
    printf("请输入删除的位置:");
    scanf("%d",&n);
    Node *Q,*P=(*L);
    while(P->next && m<n)
    {
        P = P->next;
        m++;
    }
    if(!(P->next) || m>n)//删除的是P的下一个节点,所以P不能是最后一个,否则删除的内容为NULL
    {
        printf("删除位置异常,删除失败!\n");
        return ;
    }
    Q = P->next;
    P->next = Q->next;
    free(Q);

}

void ListEmpyt(Node **L)
{
    Node *Q,*P=(*L)->next;
    while(P)
    {
        Q = P->next;
        free(P);
        P = Q;
    }
    (*L)->next = NULL;
}

void GetElem(Node *P)
{
    int i,j=1;
    P = P->next;
    printf("请输入查找的位置:");
    scanf("%d",&i);
    while(P && j<i)
    {
        P = P->next;
        j++;
    }
    if(!P || j>i)
    {
        printf("没有查找到位置%d的内容\n",i);
        return ;
    }
    printf("位置%d的内容是:%d\n",i,P->data);
}

void OutputList(Node *P)//输出链表中的内容
{
    P = P->next;
    while(P)
    {
        printf("%d\n",P->data);
        P = P->next;
    }
}

int main()
{
    Node *L;

    InitList(&L);//初始化新建链表
    OutputList(L);

    GetElem(L);//查找内容

    ListInsert(&L);//插入节点
    OutputList(L);

    ListDelete(&L);//删除节点
    OutputList(L);

    ListEmpyt(&L);//清空链表
    OutputList(L);
    return 0;
}


你可能感兴趣的:(数据结构笔记:线性表链式存储结构)