(C语言)数据结构代码实现笔记1:单链表的构造、取值、查找、插入、删除


#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ET;

#define MAXSIZE 100

单链表的存储结构
typedef struct Lnode
{
    ET data;           //结点的数据域
    struct Lnode *next;//结点的指针域 
}Lnode, *linklist;     //linklist为指向结构体Lnode的指针类型

///初始化单链表
Status Initlist(linklist *L)//L是个二级指针
{
    (*L) = (linklist)malloc(sizeof(Lnode));//动态分配新的单链表空间
    (*L)->next = NULL;//初始化指针域为空
    return OK;
}

///头插法创建单链表
void Createlist(linklist L, int n)
{
    for(int i=0;i<n;++i)
    {
        linklist p=(linklist)malloc(sizeof(Lnode));
        int data;
        scanf("%d",&data);
        p->data = data;
        p->next = L->next;
        L->next = p;
    }
}

单链表取值
Status Getelem(linklist L, int i, ET* e)
{
    linklist p = L; int j = 1;
    for(;j<=i;j++)
    {
        if( p == NULL ) return ERROR;
        p = p->next;
    }
    if(j>i+1) return ERROR;
    *e = p->data; 
    return OK;
}

///单链表查找
linklist Searchelem(linklist L,ET e)
{
    linklist p = L->next;
    while(p)
    {
        if( p->data == e ) return p;
        p = p->next;
    }
    return NULL;
}

//单链表的插入
Status Insert(linklist L, int n, ET e)
{
    linklist p = L->next;
    int j=1;
    n--;
    while(p&&j<n)
    {
        p = p->next;
        j++;
    }
    if(!p||j>n) return ERROR;
    linklist r=(linklist)malloc(sizeof(Lnode));
    r->next = p->next;
    p->next = r;
    r->data = e;
    return OK;
}

//单链表的删除
Status delete(linklist L, int n)
{
    linklist p = L->next;
    int j=1;
    n--;
    while(p&&j<n)
    {
        p= p->next;
        ++j;
    }
    if(!p||j>n) return ERROR;
    p->next = p->next->next;
    return OK;

}

查看单链表
void browselist(linklist L)
{
    linklist p = L->next;
    printf("the list is:");
    while(p){
        printf("%d ",p->data);
        p = p->next;
    };
}

int main(void)
{
    printf("please input the total number of the elems:");
    int n;
    scanf("%d",&n);
    printf("please input each number of the elems:");
    linklist L,p;
    Initlist(&L);
    
    Createlist(L,n);
    browselist(L);

    //测试取值功能
    int k;
    ET q;
    printf("\nplease input the number of the elem:");

    scanf("%d",&k);
    Getelem(L,k,&q);
    printf("%d",q);
    
    //测试查找功能
    ET r;
    printf("\nplease input the elem u want to find:");
    scanf("%d",&r);
    printf("%p",Searchelem(L,r));
    
    //测试插入功能
    ET w;
    int a;
    printf("\nplease input the elem u want to insert and to where");
    scanf("%d %d",&w,&a);
    Insert(L,a,w);
    browselist(L);
    
    //测试删除功能
    int b;
    printf("\nplease input the number of the elem u want to delete:");
    scanf("%d",&b);
    delete(L,b);
    browselist(L);

    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值