线性表---2单链表

此生再无相见时 提交于 2020-01-16 16:31:11

@Adrian
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、数据元素本身,其所在的区域称为数据域;
指向直接后继元素的指针,所在的区域称为指针域;
在这里插入图片描述

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

//声明结点结构
typedef struct Link{
    int elem;//存储整形元素
    struct Link *next;//指向直接后继的元素的指针
}link;
//创建链表的函数
link *initLink(){
    link *p=(link*)malloc(sizeof(link));//创建一个头结点
    link *temp=p;//声明一个指针指向头结点,用于遍历链表
    //生成链表
    for(int i=1;i<5;i++){
        //创建结点并初始化
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        //建立新结点与直接前驱结点的逻辑关系
        temp->next=a;
        temp=temp->next;
    }
    return p;
}
//插入元素
//p为原链表,elem表示的新数据元元素,add表示新元素要插入的位置
link * insertElem(link *p,int elem,int add){
    link *temp=p;//创建临时结点
    //首先要找到要插入位置的结点
    for(int i=1;i<add;i++){
        temp=temp->next;
        if(temp==NULL){
            printf("插入位置无效\n");
            return p;
        }
    }
    //创建插入结点c
    link * c =(link*)malloc(sizeof(link));
    c->elem=elem;
    c->next=temp->next;
    temp->next=c;
    return p;
}

//链表删除元素
//p为原链表,add为要删除的元素的值
link*delElem(link*p,int add){
    link*temp=p;//创建临时结点
    //遍历到被删除结点的上一个结点
    for(int i=1;i<add;i++){
        temp=temp->next;
        if(temp->next==NULL){
            printf("没有该结点\n");
            return p;
        }
    }
    link*del=temp->next;//单独设置一个指针指向被删除的结点,以防止丢失。
    temp->next=temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域
    free(del);//手动释放该结点,防止内存泄漏
    return p;
}

//链表查找元素
//p为原链表,elem表示被查找的元素
int selectElem(link*p,int elem){
    //新建一个指针t,初始化为头指针p
    link*t=p;
    int i=1;
    //由于头结点的存在,因此while中的判断为t->next
    while(t->next){
        t=t->next;
        if(t->elem==elem){
            return i;
        }
        i++;
    }
    //程序执行至此处,表示查找失败
    return -1;
}

//链表更新的元素
link*amendElem(link*p,int add,int newElem){
    link*temp=p;
    temp=temp->next;//在遍历之前吗,temp指向首元结点
    //遍历到待更新结点
    for(int i=1;i<add;i++){
        temp=temp->next;
    }
    temp->elem=newElem;
    return p;
}
void display(link*p)
{
    link*temp=p;//将temp指针重新指向头结点
    //只要temp指针指向的结点的next不是NULL,就至执行输出语句。
    while(temp->next){
        temp=temp->next;
        printf("%d ",temp->elem);
    }
    printf("\n");
}
int main()
{
    //初始化链表(1,2,3,4)
    printf("初始化链表为:\n");
    link*p=initLink();
    display(p);

    printf("在第4个的位置插入元素5:\n");
    p=insertElem(p,5,4);
    display(p);

    printf("删除元素3:\n");
    p=delElem(p,3);
    display(p);

    printf("查找元素2的位置为:\n");
    int address=selectElem(p,2);
    if(address == -1){
        printf("没有该元素");
    }else{
        printf("元素2的位置为:%d\n",address);
    }
    printf("更改第3的位置上的数据7:\n");
    p=amendElem(p,3,7);
    display(p);

    return 0;
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!