数据结构学习笔记-线性表链式存储(C语言实现)

时间:2021-05-13 10:17:30

写了两天,终于将线性表链式存储调通了,代码奉上:

#include <stdio.h>
#include <stdlib.h>
//定义链表存放的数据类型
typedef int Eletype;
//定义组成链表的结构体
typedef struct Node{
    Eletype data;
    struct Node *next;
}Node;
//定义链表的头指针
typedef Node *LinkList;
//链表的常用操作方法:初始化、清空、检测链表是否为空、插入、删除
LinkList init(){
    //定义头指针、要插入的结构体
    LinkList l,s;
    //定义指针类型的结构体
    l=(LinkList)malloc(sizeof(Node));
    //让链表最后一个节点的指针为空,也可以让他指向自己(循环链表)
    l->next=NULL;
    //循环生成要插入的数据
    for(int i=1;i<6;i++){
        //创建要插入的指针类型的结构体
        s=(LinkList)malloc(sizeof(Node));
        //给结构体赋值
        s->data=i;
        //把头指针的next给新生成的结构体
        s->next=l->next;
        //再让头指针指向该结构体,这样新生成的结构体一直就在前面
        l->next=s;
    }
}
void ClearAll(LinkList *l){
    //定义两个指针类型的结构体
    LinkList p,q;
    //让p指向链表的第一个数据
    p=(*l)->next;
    //当第一个数据不为空
    while(p){
        //把p的next给q,再把p释放掉,再把q给p,这样是为了把链表所有数据都释放掉而不是只释放第一个数据,把后边的落下
        q=p->next;
        free(p);
        p=q;
    }
    //把所有数据释放后,最后再让头指针指向空
    (*l)->next=NULL;
}
int isEmpty(LinkList l){
    if(l->next!=NULL){
        return 1;
    }else{
        return 0;
    }
}
void getEle(LinkList l,Eletype *e,int index){
    LinkList p;
    int i=1;
    //让p指向链表第一个数据
    p=l->next;
    //当p存在并且要取的数据不是第一个时,就让p往下指
    while(p&&i<index){
        p=p->next;
        i++;
    }
    *e=p->data;
}
void display(LinkList l,int length){
    Eletype e;
    printf("链表中的数据:\n");
    for(int i=1;i<length;i++){
        getEle(l,&e,i);
        printf("%d ",e);
    }
    printf("\n");
}
void insertEle(LinkList *l,Eletype ele,int index){
        LinkList p,s;
        int i=1;
        //定义一个指针指向头指针,比如想要在第一个位置插入,就要拿到第一个位置前面的节点。
        //经过循环拿到要插入的位置前面的节点p
        p=*l;
        while(p&&i<index){
            p=p->next;
            i++;
        }
        //创建节点给他赋值
        s=(LinkList)malloc(sizeof(Node));
        s->data=ele;
        //把新节点插进去
        s->next=p->next;
        p->next=s;
}
void deleteEle(LinkList *l,Eletype *e,int index){
    LinkList p,s;
    int i=1;
    //定义一个指针指向头指针
    p=*l;
    //当它存在第一个数据并且要删除的节点不是第一个就循环往下指
    while(p->next&&i<index){
        p=p->next;
        i++;
    }
    //p是要删除的节点前面的节点,拿到要删除的节点s,把的s的next给p的next,再给s释放掉
    s=p->next;
    *e=s->data;
    p->next=s->next;
    free(s);
}
int main()
{
    printf("Hello world!\n");
    LinkList ll;
    Eletype s=100,e=6;
    ll=init();
    printf("链表是否为空:%d\n",isEmpty(ll));
    display(ll,6);
    insertEle(&ll,e,1);
    display(ll,7);
    deleteEle(&ll,&s,1);
    display(ll,6);
    printf("删除的数据:%d\n",s);
    ClearAll(&ll);
    printf("链表是否为空:%d\n",isEmpty(ll));
    return 0;
}