C语言实现单链表(有源代码哦)专为小白!!!
首先,第一次在学校里学习数据结构与算法的时候,大家可能会发现抄书上的代码建议无法实现相应的功能(至少小编是这样的,直到放寒假的时候才实现第一个算法)。今天教大家手把手实现书上的单链表,希望能对大家数据结构的学习有所启发。提示:书中的有些参考伪代码都是通过C++实现的,如果用C++实现会带来一些方便。
C语言实现顺序表的过程中的注意事项: 书中绪论1.3,抽象数据类型的表示与实现中,关于书中伪代码的相关介绍很重要不然都不知道里面的英文字符是什么意思。代码如下图:
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType ;
//这就是书上预定义的一些东西
//Status 表示函数返回值类型
//ElemType 代表元素的类型
下面定义单链表的结构(每一种数据结构都有它的结构类型,其实就是一个结构体),代码如下:
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;//对同一结构体指针类型起了两个名字。意思是要定义一个该结构体指针,可以用LNode *a;也可以LinkList a;效果是一样的。
接下来初始化单链表(前提是要现在主函数里定义一个指向第一个节点的指针(头指针))看一下main函数代码(只看前两行代码即可,后面的需要定义其他函数之后在使用):
int main()
{menu();//菜单LinkList L;//头指针 ......
}
下面初始化单链表:
Status InitList(LinkList L)//初始化
{L=(struct LNode *)malloc(sizeof(struct LNode)); //为头结点开辟一个节点大小的内存空间L->next=NULL;//【L->】等价于【*(L).】,所以该行是把头指针指向的第一个节点的指针域置空return OK;
}
接下来创建单链表:
void CreateList(LinkList *L,int n)//创建单链表
{ LNode *r,*p;//此处*L代表的就是main函数中定义的结构体指针L*L=(struct LNode *)malloc(sizeof(struct LNode)); (*L)->data=n;(*L)->next=NULL;int i;r=*L;for(i=0;i<n;++i){p=(struct LNode *)malloc(sizeof(struct LNode)); scanf("%d",&(p->data));p->next=NULL;r->next=p;r=p;} }
接下来大家还是看我下面的整体代码吧,我感觉本菜鸡已经写不下去了。。。。。
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType ;
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;//对同一结构体指针类型起了两个名字 Status InitList(LinkList L)//初始化
{L=(struct LNode *)malloc(sizeof(struct LNode)); L->next=NULL;return OK;
}void CreateList(LinkList *L,int n)//创建单链表
{ LNode *r,*p;*L=(struct LNode *)malloc(sizeof(struct LNode)); (*L)->data=n;(*L)->next=NULL;int i;r=*L;for(i=0;i<n;++i){p=(struct LNode *)malloc(sizeof(struct LNode)); scanf("%d",&(p->data));p->next=NULL;r->next=p;r=p;} }Status ListInsert(LinkList L,int i,ElemType e)//单链表插入
{LNode *p;LNode *s;p=L;int j=0;while(p&&(j<i-1)){p=p->next;++j; }if(!p||j>i-1) return ERROR;s=(struct LNode *)malloc(sizeof(struct LNode)); s->data=e;s->next=p->next;p->next=s;return OK;
}LNode *LocateElem(LinkList L,ElemType e)//查找操作
{LNode *p;p=L->next;while(p && (p->data!=e)) {p=p->next;}return p;
}
Status GetElem(LinkList L,int i,ElemType *e)//取值操作
{LNode *p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i) return ERROR;*e=p->data;return OK;
}Status ListDelete(LinkList L,int i)//删除操作
{LNode *p,*q;p=L;int j=0;while((p->next)&&(j<i-1)){p=p->next;++j;}if(!(p->next)||(j>i-1)) return ERROR;q=p->next;p->next=q->next;free (q);return OK;
}void TraverseList(LinkList p)
{if(p){printf("%d\n",p->data);//第一次遍历输出的是单链表长度 TraverseList(p->next);}
}void menu()
{printf("*************\n1,初始化顺序表\n2,创建单链表\n3,插入\n4,结束\n5,查找\n6,删除\n7,取值\n8,递归输出各个节点\n*************\n");
}int main()
{menu();LinkList L;//头指针 int *z;int i,k,flag=1,e,n;while(flag){printf("请输入指令\n");scanf("%d",&k);switch(k){case 1:if(InitList(L)==OK)printf("内存分配成功\n");elseprintf("内存分配失败\n");break;case 2:printf("输入要创建的单链表的元素个数\n");scanf("%d",&n);printf("请输入各个元素 \n");CreateList(&L,n);printf("创建的单链表成功\n");printf("第二个元素值:%d\n",L->next->next->data);break;case 3:printf("请分别而输入插入位置和插入的数据,例如:(2,1000)注意逗号为英文字符\n\n");scanf("%d,%d",&i,&e);if(ListInsert(L,i,e)==OK)printf("插入成功\n");elseprintf("插入失败\n");break;case 4:flag=0;break;case 5: printf("请输入要查找的数据:\n");scanf("%d",&e);if(LocateElem(L,e)==NULL)printf("查找失败\n");elseprintf("数据所在位置为%d\n",LocateElem(L,e));break; case 6:printf("您要删除第几个数据:\n");scanf("%d",&i);if(ListDelete(L,i)==OK) printf("删除成功\n");elseprintf("删除失败\n");break;case 7:z=&k;printf("您要取第几个数据:\n");scanf("%d",&i);if(GetElem(L,i,&k)==OK)printf("第%d个数据为:%d\n",i,k);elseprintf("取值失败\n");break;case 8:TraverseList(L);break;default:printf("输入有误\n");break;}}
}
### 运行结果
代码中可能有一些错误或者定义了没有使用的变量,大家可以自己多研究一下。大家一定要多敲多查才能慢慢理解,如果还有需要栈、队列、二叉树代码的小伙伴大家可以评论一下,我看有需要的话就分享给大家。(我真是小菜鸡,本来还想写完,结果....呜呜呜)。
C语言实现单链表(有源代码哦)专为小白!!!相关推荐
- c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统
前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...
- c语言实现可变单链表,c语言实现单链表
c语言实现单链表 c语言实现单链表 定义 创建 销毁 清空 打印 获取长度 查询 删除第pos个结点 在第pos插入结点 定义 首先来看一看单链表的定义(看看百度的) 单链表是一种链式存取的数据结构, ...
- TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
TypeScript算法专题 - 基于TypeScript语言的单链表实现 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:https://blog.csdn.n ...
- c语言实现单链表的创建(完整版)
使用c语言实现单链表是考研的重点.但是如何实现却是一个难点.下面是我写的一个简单的创建单链表的代码. #include<stdio.h> #include<stdlib.h> ...
- java语言实现单链表---不含头结点
java语言实现单链表---不含头结点 一.相关概念 1.什么是线性表 2.什么是顺序表 3.什么是链表 4.单链表.双链表.循环单链表.循环双链表 5.头结点和首结点 6.常见的栈和队列与线性表的关 ...
- 浅谈:数据结构之单链表,java代码演示单链表
单链表 本文是观看尚硅谷韩老师视频学习总结,部分来源网络. 单链表介绍 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每 ...
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...
- C语言基于单链表的词典软件
C语言基于单链表的词典软件 实验1: 日期:2022-10-4 类型:设计型 题目:基于单链表的词典软件 内容: 利用单链表存储词典,可以实现从文件中加载数据.查询单词.添加词条.删除词条.将词典保存 ...
- Go语言-实现单链表反转算法
Go语言实现链表的逆序_头插法 头插法与尾插法 头插法 概念 特点 核心过程 Go语言实现 ==注意==:上述方法是带头指针的头插法的实现,如果是带头节点的头插法需要做一定的修改 如果是带头节点的,则 ...
- C语言实现单链表基本操作
C语言实现单链表基本操作的 目录
最新文章
- 打开线程 | 进程 | 协程的大门
- 一名英文不好的程序员的救赎
- modal ajax,在Modal中调用Vue.js AJAX
- web前端之异常/错误监控
- OpenCASCADE绘制测试线束:OCAF 命令之应用命令
- 虚拟Web主机(基于域名配置,基于ip地址,基于端口)
- 最后一个单词的长度Python解法
- RabbitMQ入门:路由(Routing)
- 一行代码如何隐藏 Linux 进程?
- asp.net 页面右下角弹出类似QQ或MSN的消息提示
- 电脑的记事本如何显示行数
- 计算机内存加速,电脑内存运行速度如何提升
- 【程序人生】为什么开通博客?
- python测试开发实战_自动化平台测试开发:Python测试开发实战
- 这样的男人有几个;1.会为你哭的男人2.喜欢欺负你的男人3.会主动亲你的男人4.喜欢叫你傻瓜
- ShareSDK iOS端微信如何获取authcode值
- LibGDX QQ群建立,欢迎对libGDX有兴趣的程序员加入。
- 阿里云短信服务报错:SignatureDoesNotMatch : Specified signature is not matched with our calculation.
- 周末出动:广州石室圣心天主教堂
- 运营数据分析模型—漏斗分析