数据结构(C语言版)学习笔记2-单链表

数据结构(C语言版)学习笔记2-单链表

1.单链表定义

typedef int ElemTypes;
typedef struct node
{
    ElemTypes data;  //数据域
    struct node *next;//指针域
}Slinks;

2.单链表基本操作

//1.单链表初始化(带头结点)
Slinks *creatslink(int i);
//2.求链长(带头结点)
ElemTypes ListLengths(Slinks*head);
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t);
//4插入操作
int InsertLists(Slinks*L,int i,ElemTypes e);
//5.删除操作
int DeleteLists(Slinks*L,int i);
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e);
//7.输出链表
void Lists(Slinks*L);

3.完整程序

完整程序包括三个文件:

mains.c(主程序)
用于测试单链表基本操作
Slink.h
标准库导入,存放类型定义,符号定义等预定义内容及函数声明。
Slink.c
存放单链表基本操作函数主体内容。

①mains.c
//mains.c
#include"Slink.h"

void main()
{
    int j=0;
    Slinks *L=NULL; //创建一个结构体指针指向单向链表头
    printf("\n-------程序运行开始!-------\n");

    L=creatslink(5);
    Lists(L);
    printf("\n链表长为:%d\n",ListLengths(L));
    //3.取链表内元素
    GetElems(L,3,&j);
    printf("表内第3个元素为:%d\n",j);
    InsertLists(L,2,666);
    printf("\n链表长为:%d\n",ListLengths(L));
    Lists(L);
    printf("删除操作%d\n", DeleteLists(L,3));
    Lists(L);
    printf("元素666在第%d号元素。\n", LocateLists(L,666));

    printf("\n-------程序运行结束!-------\n");
}
②Slink.h
//Slink.h
#ifndef _SLINK_H
#define _SLINK_H
#include"stdio.h"
#include"stdlib.h"

typedef int ElemTypes;
typedef struct node
{
    ElemTypes data;  //数据域
    struct node *next;//指针域
}Slinks;

/*基本操作声明*/
//1.单链表初始化(带头结点)
Slinks *creatslink(int i);
//2.求链长(带头结点)
ElemTypes ListLengths(Slinks*head);
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t);
//4插入操作
int InsertLists(Slinks*L,int i,ElemTypes e);
//5.删除操作
int DeleteLists(Slinks*L,int i);
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e);
//7.输出链表
void Lists(Slinks*L);


#endif
③Slink.c
//Slink.c
#include"Slink.h"

//1.单链表初始化(带头结点)
Slinks *creatslink(int i)
{
    Slinks *p,*s,*head;
    int j=0;
    p=head=(Slinks*)malloc(sizeof(Slinks));//创建头指针
    for(j=0;j<i;j++)
    {   
        s=(Slinks*)malloc(sizeof(Slinks));//创建第j+2个结点存储第j+1个元素
        printf("请输入第%d个元素:",j+1);
        scanf("%d",&s->data);               //结点数据域赋值
        p->next=s;                          //将上一个结点的next指针指向该结点
        p=s;                          //将P指针指向该结点
    }
    p->next=NULL;//将最后一个结点的next指针置空
    printf("链表创建成功!head=%o\n",head);
    return head;
}
//2.求表长(含首元结点)
ElemTypes ListLengths(Slinks*head)
{
    int i;
    Slinks*p=head;
    for(i=0;p!=NULL && p->data;i++)//循环历遍结点个数
        p=p->next;
    
    return i;//含首元结点
}
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t)
{
    int n;
    Slinks*p=L;
    if(i<1 || i>ListLengths(L))return 0;//参数i不合理,取元素失败返回0
    for(n=0;n<i;n++)//循环历遍结点个数
        p=p->next;
    *t=p->data;     //其值通过指针t返回
    return 1;
}
//4.插入操作
int InsertLists(Slinks*L,int i,ElemTypes e)
{
    Slinks*p=L,*t;
    int n;
    if(i<1 || i>ListLengths(L))return 0;
    else{
        for(n=0;n<i-1;n++)
            p=p->next;
        t=p->next;
        p->next=(Slinks*)malloc(sizeof(Slinks));
        p=p->next;
        p->data=e;
        p->next=t;
    return 1;
    }
}
//5.删除操作
int DeleteLists(Slinks*L,int i)
{
    Slinks*p=L,*t;
    int n;
    if(i<1 || i>ListLengths(L))return 0;
    else{
        for(n=0;n<i-1;n++)
            p=p->next;
        t=p->next;
        p->next=t->next;
        free(t);
    return 1;
    }
}
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e)
{
    Slinks*p=L;
    int n;
    for(n=0;p->data!=e && p!=NULL;n++)
        p=p->next;
    if(p->data == e)//找到,返回位序
        return n;
    else            //没找到,返回0
        return 0;
}
//7.输出链表
void Lists(Slinks*L)
{
    Slinks*p=NULL;
    p=L;
    p=p->next;                      //跳过首元结点
    printf("链表内元素为:\n");
    while(p!=NULL && p->data)
    {
        printf("-%d",p->data);
        p=p->next;
    }
    printf("\n");
}

本次学习笔记如上所示,不足之处欢迎大家批评指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值