欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

创建链表:表头和表尾插入方法

最编程 2024-06-11 13:34:04
...

         此处研究的是数据结构中头插法和尾插法的代码实现,一开始纠结于传入函数中的参数L最后是一个指针还是一个结点,后来发现还是用的少了,仅适用于初学这部分的时候加深一下印象。

        L在此处一直都扮演的是头指针的角色,LNode是新的结构体类型,LinkList其实就与LNode *是等价的,只是为了分别强调有的地方是结点,而有的地方是链表,才对结构体指针又起了别名。在main函数中定义了头指针L,这是我们进入和创建链表的入口,头插法和尾插法函数的返回值类型也是LinkList指针类型,用于返回我们的头指针L(这里L就像是提纲挈领的那个抓手),进入函数后,对L进行初始化,动态申请一个LNode大小的结点空间,但是注意,此处返回的仍然是一个指针,L只是指向这片空间而已。然后利用箭头才能够实现直接通过指针对结构体成员进行操作,s也是通过动态申请得到的一个指向新建结点的指针,最后的结果是,把s(指针就是一个地址)赋值给了L的Next指针,s的Next指针指向了NULL,L依然是指向头结点(并没有数据域的一个结点)的头指针。

        头插法由于一直使用的都是头指针,所以也就不需要其他指针的协助,但是要注意在头插法中头指针最初的指向一定要初始化为NULL,因为这个内容是一直要延续下去且不会再有赋值操作的;但如果是尾插法,就会需要定义两个移动的指针,其中r指针也称为尾指针,始终指向表尾结点,这样就可以免去不断从头指针向后遍历的过程,降低时间复杂度。

#include <stdio.h>
#include <stdlib.h>
#define ElemType int
//在预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串去代换,这称为“宏替换”或“宏展开”。

//typedef定义以后可以不使用struct来声明一个结构体变量
typedef struct LNode{
    ElemType Data;
    struct LNode *Next;//结构体自引用只能自引用指针
}LNode,*LinkList;//一个是结点,一个是指针,LinkList就等于(LNode *)
//注意此时定义的结构体就成为了一种新的类型
//头指针是这种新类型的一个指针

//1.链表的创建(头插法)(逆向建立单链表)
LinkList CreatList_Head(LinkList L){//返回值也是指针类型,要求传入一个指针
    LinkList s;//s也是一个指针,也就是一个地址
    int x;
    L=(LNode *) malloc(sizeof(LNode));//创建头结点,L依然是指向这块空间的头指针
    L->Next=NULL;//初始为空链表,通过结构体指针直接获取结构体成员
    scanf("%d",&x);//输入结点的值
    while(x!=9999){//输入9999表示结束
        s=(LNode*) malloc(sizeof(LNode));//创建新结点
        s->Data=x;
        s->Next=L->Next;
        L->Next=s;//把第一个结点的地址赋给了L的Next指针,把两个结点连接起来了
        scanf("%d",&x);
    }
    return L;
}

//2.尾插法(正向建立单链表)
LinkList CreatList_Tail(LinkList L){//要求传入一个指针
    int x;
    L=(LNode *) malloc(sizeof(LNode));
    LNode *s,*r=L;//此处的r就是我们的尾指针
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*) malloc(sizeof(LNode));
        s->Data=x;
        r->Next=s;//r指向新的表尾结点
        r=s;
        scanf("%d",&x);
    }
    r->Next=NULL;//尾结点指针置空
    return L;
}

void PrintList(LinkList L){
    LinkList p;
    p=L->Next;
    printf("%s\n","结果链表如下:");
    while(p!=NULL){
        printf("%d",p->Data);
        p=p->Next;
    }
    printf("\n");
}

int main(){
    LinkList L;//创建头指针
    L= CreatList_Head(L);
    PrintList(L);
    L= CreatList_Tail(L);
    PrintList(L);
    return 0;
}