首页 > 其他分享 >单链表

单链表

时间:2023-05-30 20:57:42浏览次数:34  
标签:pb 单链 int next Linklist pc pa

1、特点:任意存储,顺序存取

2、结构体定义和预定义

#include<stdio.h>
#include<stdlib.h>//malloc函数

#define ElemType int
#define Status int
#define ERROR 0
#define OK 1

typedef struct Lnode
{
   ElemType data;
   struct Lnode *next;
}Lnode,*Linklist;

3、初始化(本来头节点的初始化也放置在构建链表的函数中,但是一直段错误,所以吧头结点的初始化放在了主函数内)

void Create_L(Linklist L,int n)//头插法 还有一种尾插法,都可以简单实现
{
    int i;
    Linklist p;
    for(i = n;i>0;--i){//一开始需要定义节点个数
        p = (Linklist)malloc(sizeof(Lnode));
        printf("please input integer:");
        scanf("%d",&p->data);
        p->next = L->next;//头插法;
        L->next = p;
// q = L;q->next = p; q = p;尾插法 } }

 4、获取单链表的第i个元素

//find获取第i个元素
Status GetElem_L(Linklist L,int i,ElemType *e)
{
    Linklist p;
    int j;
    p = L->next;//注意啊,单链表的操作,一般都会先赋值头节点,而不是直接拿头结点进行操作
    j = 1;
    while(p&&j<i)
    {
        p = p->next;//找到j的位置
        j++;
    }
    if(!p||j>i)
    {
        return ERROR;
    }
    *e = p->data;
    return OK;
}

 5、在i的位置插入元素e

//在i位置插入元素e
Status ListInsert_L(Linklist L,int i,ElemType e)
{
    Linklist p,s;
    p = L;
    int j = 0;
    while(p&&j<i-1)//找到插如位置的前一个节点
    {
        p = p->next;
        j++;
    }
    if(!p||j>i-1)
    {
        return ERROR;
    }
    s = (Linklist)malloc(sizeof(Lnode));//为新节点申请空间,把节点放进单链表中
    s->data = e;
    s->next = p->next;
    p->next = s; 
    return OK;
}

  6、删除节点i并且保存其元素

//删除位置i的元素并且保存
Status ListDelete_L(Linklist L,int i,ElemType *e)
{
    Linklist p;
    Linklist q;
    int j = 0;
    p = L;
    while(p&&j<i-1)//找到删除节点的前一个
    {
        p = p->next;
        j++;
    }
    if(!p||j>i-1)
    {
        return ERROR;
    }
    q = p->next;
    *e = q->data;
    p->next = q->next;
    free(q);//释放删除节点的空间
    return OK;
}

  7、两个单链表的操作,ab有序,c也有序

void MergeList_L(Linklist a,Linklist b,Linklist c)
{
    Linklist pa,pb,pc;
    pa = a->next;//有头结点
    pb = b->next;
    pc = c = a;
    while(pa&&pb)
    {
        if(pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    while(pa)
    {
        pc->next = pa;
        pc = pa;
        pa = pa->next;
    }
    while(pb)
    {
        pc->next = pb;
        pc = pb;
        pb = pb->next;
    }
    free(b);//a作为c的相应头结点,所以只释放了b
}

8、主函数

int main()
{
    Linklist La = (Linklist)malloc(sizeof(Lnode));
    La->next = NULL;;
    int n;
    int i = 2;
    ElemType e;
    printf("please input num:");
    scanf("%d",&n);
    Create_L(La,n);
    Output(La);

    GetElem_L(La,n,&e);
    printf("%d\n",e);

    ListInsert_L(La,i,e);
    Output(La);

    ListDelete_L(La,i,&e);
    printf("%d\n",e);
    Output(La);


    free(La);
    return 0;

}

  9、输出函数

void Output(Linklist L)
{
    Linklist p = L->next;
    while(p)
    {
        printf("%4d",p->data);
        p = p->next; 
    }
    printf("\n");
}

  

  

标签:pb,单链,int,next,Linklist,pc,pa
From: https://www.cnblogs.com/gunancheng/p/17443745.html

相关文章

  • 单链表——追加函数(有无懂的大佬解答一下why不加强制类型过不去)
    #include<bits/stdc++.h>usingnamespacestd;typedefstruct{intid;stringname;}Data;typedefstruct{ DatanodeData; structNode*nextNode;}CLtype;//追加链表CLtype*CLAddEnd(CLtype*head,Datanodedata){CLtype*node,*htemp; if(!(node=(CLt......
  • 单链表
    单链表的每个结点,包含值和链接到下一个结点的引用字段。//definitionforsingly-linkedlist.structSinglyListNode{intval;SinglyListNode*next;SinglyListNode(intx):val(x),next(Null){}//用头结点来表示整个列表};与数组不同,我们无法在常量时间内访......
  • ds:带头结点的单链表与不带头结点的单链表区别
     写在前边:单链表都有头指针,不一定有头结点;有无头结点的单链表,定义时数据类型都一样,只是初始化时、插入、删除时不同。 一、带头结点的单链表头结点:为方便编写代码而设置的头结点。存储结构:L->头结点->a1->a2->NULL,头结点不存储数据初始化:malloc申请空间后要L->next=NULL......
  • ds:单链表
    写在前边:单链表:1.带头结点的单链表:L头指针->头结点(data域不存数据元素,只指向下一个元素)->a1->a2->..->NULL2.不带头结点的单链表:L头指针->a1->a2...->NULL以上两种区别在于:无头结点的单链表在进行插入/删除元素时要对i=1的情况做特殊处理 一、带头结点的单链表基本操作#......
  • 【数据结构】链式型存储结构-循环单链表
    1 前言对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样一来,不从头结点出发,这样就无法访问到全部结点。为了解决这个问题,我们只需要将单链表的尾结点的指针由空指针改为指向头结点......
  • 【数据结构】链式型存储结构-单链表
    1 前言线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置。比起顺序存储结构每个元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址(指针)。也就是说......
  • c#-单链表
    namespaceMyLink;publicclassMyLinkedList{privateint_size{get;set;}publicclassMyTreeNode{publicintval{get;set;}publicMyTreeNodenext{get;set;}publicMyTreeNode(intval){this.val=val;......
  • java设计单链表
    packagelinked;/***@date2023/4/2622:51*@description单链表*/publicclassSingleLinkedList{privateintsize=0;privateNodehead;privateNodetail;publicstaticclassNode{privateObjectdata;privateNodenext;......
  • 单链表的实现
    链表的概念我们知道顺序表的储存方式是一片连续的空间里面储存数据而链表就不一样了,从这个图我们可以看到在一个链表里面有两个储存空间的部分,一部分是用以储存我们的数据,而另一部分储存的是一个结构体的地址,而这个地址指向的空间里面也有两个部分的储存空间用处和上面的一样,直到最......
  • 约瑟夫环问题---&解题方法 静态单链表&一维数组
      importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);intn=input.nextInt();intm=input.nextInt();int[]ant=newint[150];for(int......