首页 > 其他分享 >线性表之单链表(上)

线性表之单链表(上)

时间:2023-09-18 20:25:51浏览次数:28  
标签:单链 return 线性表 int list next linklist NULL

单链表就是一个表结构最后存储的位置是下一个表结构的地址,一般通过p->next表示存储的下一个位置的地址

// link_list.h
typedef int data_t;

typedef struct node{
    data_t data;
    struct node *next;
}listnode, *linklist;

linklist list_create();
int list_tail_insert(linklist H, data_t value);
linklist list_get(linklist H, int pos);
int list_insert(linklist H, data_t value, int pos);
int list_show(linklist H);
// link_list.c
//
// Created by Lenovo on 2023/9/17.
//
# include <stdio.h>
# include <stdlib.h>
# include "link_list.h"

linklist list_create(){
    linklist H;

    H = (linklist)malloc(sizeof(listnode));
    if (H == NULL){
        printf("malloc failed\n");
        return H;
    }
    //申请完堆空间后对链表进行赋值,初始化
    H->data = 0;
    H->next = NULL;
}

int list_tail_insert(linklist H, data_t value){
    linklist p;
    linklist q;

    if (H == NULL){
        printf("H is NULL\n");
        return -1;
    }
    // 1 new node p
    if ((p=(linklist)malloc(sizeof(listnode))) == NULL){
        printf("malloc failed\n");
        return -1;
    }
    p->data = value;
    p->next = NULL;

    //2 locate locate ... tail node
    q = H;
    while(q->next != NULL){
        q = q->next;
    }
    //3 insert;
    q->next = p;
    return 0;
}

linklist list_get(linklist H, int pos){
    linklist p;
    int i;

    if (H == NULL){
        printf("H is NULL\n");
        return NULL;
    }
    if (pos == -1){  // 选择-1时,退出
        return H;
    }
    p = H;
    i = -1;
    while (i < pos){
        p = p->next;
        if (p == NULL){
            printf("pos is invalid\n");
            return NULL;
        }
        i++;
    }
    return p;
}

int list_insert(linklist H, data_t value, int pos){
    linklist p;
    linklist q;

    if (H == NULL){
        printf("H is NULL\n");
        return -1;
    }
    //1 locate node p (pos-1)
    p = list_get(H, pos-1);
    if (p == NULL){
        return -1;
    }
    //2 new node q
    if((q=(linklist)malloc(sizeof(listnode))) == NULL){
        printf("malloc is failed\n");
        return -1;
    }
    q->data = value;
    q->next = NULL;

    //3 insert
    q->next = p->next;
    p->next = q;
    return 0;
}

int list_show(linklist H){
    linklist p;

    if(H==NULL){
        printf("H is NULL\n");
        return -1;
    }
    p= H;
    while(p->next != NULL){
        printf("%d ", p->next->data);
        p = p->next;
    }
    puts("");
    return 0;
}
// test.c
//
// Created by Lenovo on 2023/9/17.
//
# include <stdio.h>
# include "link_list.h"

void text_get();

int main(){
    linklist H;
    int value;

    H = list_create();
    if(H==NULL){
        return -1;
    }
    printf("input:");
    while(1){
        scanf("%d", &value);
        if (value == -1){
            break;
        }
        list_tail_insert(H, value);
        printf("input:");
    }
    list_show(H);
    list_insert(H, 100, 2);
    list_show(H);

    return 0;
}

void test_get(){
    linklist H;
    int value;
    linklist p;

    H = list_create();
    if(H == NULL){
        return;
    }
    printf("input:");
    while (1){
        scanf("%d", &value);
        if(value == -1){
            break;
        }
        list_tail_insert(H, value);
        printf("input:");
    }
    list_show(H);

    p = list_get(H, 4);
    if(p!=NULL){
        printf("value=%d\n", p->data);
    }
}

标签:单链,return,线性表,int,list,next,linklist,NULL
From: https://www.cnblogs.com/dack-zt-deng/p/17712953.html

相关文章

  • 第二章 线性表
    线性表2.5.3循环链表最后一个结点的指针域指向头结点终止条件:p!=L&&p->next!=L循环链表的合并:设立尾指针。将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。时间复杂度是O(1)2.5.4双向链表克服了单链表......
  • 王道数据结构:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先
    题目:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的排序方法是()A.先按k1进行直接插入排序,再按k2进行简单选择排序B.先按k2进行直接插入排序,再按k1进行简......
  • 9.15单链表无哨兵java实现
    publicclassMain{publicstaticvoidmain(String[]args){LNodeL=newLNode();System.out.println(L.number());L.Isempty();L.addFirst(4);//头插L.addFirst(3);L.addFirst(2);L.addFirst(1);L.a......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • 线性表——链式存储
    单链表(有头结点)#include<stdlib.h>//定义typedefstructLNode{intdata;//数据域structLNode*next;//指针域指向下一个结点,所以是structLNode类型}LNode,*LinkList;//*LinkList用于表示这是一个指向structLNode类型的指针//初始......
  • C数据结构-线性表之顺序表
    什么是线性表线性表的插入元素线性表的删除元素线性表顺序存储的缺点线性表的特点1.线性表的实例首先我们创建3个文件,分别如下:liner_data--sqlist.c--sqlist.h--test.csqlist.h//.h文件中定位数据的结构以及函数的方法typedefintdata_t;#defineN128......
  • 复习知识,学习单链表数组实现 (9/4)
    双指针经典题目800.数组元素的目标和给定两个升序排序的有序数组 AA 和 BB,以及一个目标值 xx。数组下标从 00 开始。请你求出满足 A[i]+B[j]=xA[i]+B[j]=x 的数对 (i,j)(i,j)。数据保证有唯一解。输入格式第一行包含三个整数 n,m,xn,m,x,分别表示 AA 的长度,BB......
  • 单链表题目*4
    //获取单链表有效结点个数publicstaticintgetLength(ListNodehead){if(head.next==null){return0;}intresult=0;ListNodetemp=head.next;while(temp!=null){result++;temp=temp.next;}returnresult;}//......
  • 单链表相关
    单链表创建总结*创建ListNode结点类有属性valnext考虑现实使用val定义为一个no和若干val,toString()重写*创建SingleLinkedList单链表类有private属性头指针head需要初始化*单链表类需要有的方法:*遍历方法:不为空、则从头指针.next首元结点开始遍历,直至尾部*插入结......
  • 用单链表解决约瑟夫问题 C语言实现
    编号为1,2,3,…,n的n个人按顺序针方向围坐一张圆桌旁,每个人手中持有一个密码(正整数)。首先输入一个正整数作为报数上限值m,然后,从第一个人开始按顺序针方向自1开始顺序报数,报到m的人离开桌子,并将他手中的密码作为新的m值,从顺序针方向的下一个就坐在桌旁的人开始重新从1报数,如此下去,直......