单链表操作-C语言

单链表操作-C语言

描述:

用户输入 3 4 5 6 7 9999一串整数,9999代表结束,通过头插法新建链表,并输出。通过尾插法新建链表,并输出。

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

typedef int ElemType;
typedef struct LNode {
    ElemType data;
    struct LNode* next;
} LNode, *LinkList;

//头插法新建链表
LinkList HeadCreatList(LinkList &L){
    LNode *s;
    int x;
    L=(LinkList) malloc(sizeof(LNode)); //带头结点的链表
    L->next=NULL; //良好习惯,头结点指向NULL,避免脏数据,L->data为空
    scanf("%d",&x); //从标准输入读取数据 3 4 5 6 7 9999
    while(x!=9999)
    {
        s=(LNode *) malloc(sizeof(LNode)); //申请内存空间给结点s,并进行强制类型转换
        s->data=x; //scanf读取的数据,赋予新空间中的data成员
        s->next=L->next; //让新节点的next指针指向链表的第一个元素
        L->next=s; //头指针指向第一个元素
        scanf("%d",&x); //循环读取数据
    }
    return L;
}

//尾插法新建链表
LinkList TailCreatList(LinkList &L){
    int x;
    L=(LinkList) malloc(sizeof(LNode)); //带头结点的链表
    LNode *s,*r=L; //r代表链表表尾指针,指向链表尾部,初始化都指向头结点
    scanf("%d",&x); //从标准输入读取数据 3 4 5 6 7 9999
    while(x!=9999)
    {
        s=(LNode *) malloc(sizeof(LNode)); //申请内存空间给结点s,并进行强制类型转换
        s->data=x; //scanf读取的数据,赋予新空间中的data成员
        r->next=s; //尾部结点指向新节点(指向新节点,从而将新节点连接到链表的尾部)
        r=s; //指向新的表尾结点(永远保持r指向最后一个结点)
        scanf("%d",&x); //循环读取数据
    }
    r->next=NULL;
    return L;
}

//打印链表中每个结点的数据
void  PrintList(LinkList L){
    L=L->next; //让L指向第一个有数据的结点
    while (L!=NULL)
    {
        printf("%d",L->data); //打印当前结点数据
        L=L->next; //指向下一个结点
        if(L!=NULL)
        {
            printf(" ");
        }
    }
}
int main() {
    LinkList L=NULL; //链表头,结构体指针类型
    LinkList search; //存储读取到的某个结点
    HeadCreatList(L); //头插法建立链表
    PrintList(L); //打印链表
    TailCreatList(L); //尾插法建立链表
    PrintList(L); //打印链表
    return 0;
}