zoukankan      html  css  js  c++  java
  • 单链表的创建和基本操作 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。

  • 相关阅读:
    线程池1-线程池原理
    CompletableFuture 详解
    服务崩溃的本质
    关于C#读取MySql数据时,返回DataTable中某字段数据是System.Array[]形式
    关于VS2010中的TraceDebugging文件夹浅说
    C#更改win7系统时间的代码,以及为什么更改不成功
    在DataColumn.Expression把DateTime转换成String的问题
    C#用委托实现异步,异步与多线程的异同
    DataColumn.Expression提示“...循环引用”的错误
    JDBC插入百万数据,不到5秒!
  • 原文地址:https://www.cnblogs.com/woju/p/12548613.html
Copyright © 2011-2022 走看看