• 单链表的创建和基本操作 C语言


    创建单链表,首先要建立一个结构体,如下:

    #include<stdio.h>
    #include<stdlib.h>
    typedef int ElemType;
    typedef struct Lnode{
        ElemType data;
        struct Lnode *next;
    }Lnode,*LinkList;

    创建链表,这里使用的是尾插法建立链表,它主要是在表尾不断地添加新元素,直到输入-1,然后退出。

    LinkList CreatList()//创建列表 
    {
        ElemType x;
        LinkList head,p,tail;
        head=(LinkList)malloc(sizeof(Lnode));
        head->next=NULL;
        tail=head;
        scanf("%d",&x);
        while(x!=-1){
            p=(LinkList)malloc(sizeof(Lnode));
            p->data=x;
            p->next=NULL;
            tail->next=p;
            tail=p;
            scanf("%d",&x); 
        }
        return head;
    }

    计算表长,运用遍历,将链表的长度利用一个变量存储,然后有指针存储。

    int LongList(LinkList head,int* length)//计算表长 第一个元素列表 第二个存储表长 
    {
        LinkList p;
        p=(LinkList)malloc(sizeof(Lnode));
        p=head->next;
        if(p==NULL){
            return 0;
        } 
        int i=1;
        while(p){
            p=p->next;
            i++;
        }
        *length=i-1;//因为每次先查询后面的元素,所以i也把最后一个NULL加了进去,所以要减一 
        return 1;
    }

    插入元素,单链表插入元素,需要知道该位置的链表元素,然后先将插入元素的尾部连接到链表内,再将该节点的头部接入。

    int insert(LinkList head,int i,ElemType x)//插入 1链表 2插入位置 3插入元素 
    {
        LinkList p,s;
        p=(LinkList)malloc(sizeof(Lnode));
        p=head->next;
        int j=1;
        while(p&&j!=i-1){
            p=p->next;
            j++;
        }
        if(p==NULL||j!=i-1){
            return 0;
        }
        s=(LinkList)malloc(sizeof(Lnode));
        s->data=x;
        s->next=p->next;
        p->next=s;
        return 1;
    }

    删除元素,需要知道该元素前面位置的链表节点,然后进行删除,并返回删除元素,同时也要将该节点内存释放。

    int DelList(LinkList head,int i,ElemType *n)//删除元素 1链表 2删除位置 3记录删除元素 
    {
        LinkList p,s;
        p=(LinkList)malloc(sizeof(Lnode));
        p=head->next;
        s=(LinkList)malloc(sizeof(Lnode));
        int j=1;
        while(j!=i-1&&p){
            p=p->next;
            j++;
        }
        if(j!=i-1||p->next==NULL){
            return 0;
        }
        s=p->next;
        p->next=s->next;
        *n=s->data;
        free(s);
        return 1;
    }

    查询元素,利用遍历列表,找到要查找位置的元素,并返回。

    int search(LinkList head,int i,ElemType *n)//查找元素 1链表 2查找元素的位置 3该位置上的元素是什么 
    {
        LinkList p;
        p=(LinkList)malloc(sizeof(Lnode));
        p=head->next;
        int j=1;
        while(j!=i&&p){
            p=p->next;
            j++;
        }
        if(p==NULL||j!=i){
            return 0;
        }
        *n=p->data;
        return 1;
    }

    输出单链表所有元素。

    void print(LinkList head)//输出 
    {
        LinkList p;
        p=head->next;
        while(p){
            printf("%d ",p->data);
            p=p->next;
        }
    }

    在该链表的创建和基本操作中,我都返回了0或1,其作用是测试单链表的操作是否符合规则,操作成功,返回1,失败,返回0。

  • 相关阅读:
    36.百马百担问题。有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大中小马多少匹,共有多少组解?
    35.鸡兔同笼问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
    34.设s=1+1/2+1/3+…+1/n,求与8最接近的s的值及与之对应的n值
    33.求1*2+2*3+3*4+……前n项的和
    32.求1+(1+2)+(1+2+3)+(1+2+3+4)+……的前n项的和
    31.假定2007年的一月一日是星期一,输入一个时间(包含年、月、日),求出它是星期几。
    vue-cli3 一直运行 /sockjs-node/info?t= 解决方案
    python pdf转word
    window django-https 证书
    Docker技术应用场景(转载)
  • 原文地址:https://www.cnblogs.com/woju/p/12548613.html
Copyright © 2020-2023  润新知