【数据结构】单链表的实现(C语言)
单链表是线性表链式储存的一种形式,其中的结点一般含有两个域,一个是存放数据信息的info域,另一个是指向该结点后继结点存放地址的指针next域。一个单链表必须要有一个首指针指向链表中的第一个结点。
单链表要掌握以下几种操作:
1、建立一个空的单链表。
2、输出单链表中个结点的值。
3、在单链表中查找第i个结点。
4、在单链表的第i个结点后插入一个值为x的新结点。
5、在单链表中删除一个值为x的结点。
以下是头文件
#ifndef HEAD_LINK_H_INCLUDED
#define HEAD_LINK_H_INCLUDED#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link_node
{datatype info;struct link_node *next;
}N;//创建一个空链表
N *init()
{return NULL;
}//创建一个单链表
N *creat(int len)
{int a,i;N *p,*head,*q;if (len<1){return NULL;}else{for(i=1;i<=len;i++){scanf("%d",&a);p=(N*)malloc(sizeof(N));p->info=a;if(i==1){p->next=NULL;head=p;q=p;}else{q->next=p;q=p;p->next=NULL;}}return head;}
}//输出单链表中各节点的值
void display (N *head)
{N *p=head;if(!p){printf("\n该链表是空的!\n");}else{printf("\n单链表各节点的值为:\n");while(p){printf("%d",p->info);if(p->next){printf(" -> ");}p=p->next;}printf("\n");}
}//在单链表中查找第i个节点的值
N *find(N *head ,int i)
{int j=1;N *p=head;if(i<1){return NULL;}while(p && i!=j){p=p->next;j++;}return p;
}//在单链表中找出值为i的位置
int node_position(N* head,int i)
{N *p;int j=1;p=head;while(p && p->info!=i){p=p->next;j++;}if(!p){return 0;}else{return j;}
} //计算单链表的节点数目
int counts(N *head)
{N *p;int count=0;p=head;while(p){count++;p=p->next;}return count;
}//在单链表第i个结点后插入一个值为x的新新结点
N *insert(N *head,datatype x,int i)
{N *p,*q;q=find(head,i);/*找到第i个结点*/if(!q && i!=0){printf("找不到第%d个节点,不能插入%d",i,x);}else{p=(N*)malloc(sizeof(N));p->info=x;if(i==0){p->next=head;head=p;}else{p->next=q->next;q->next=p;}}return head;
}//从单链表中删除一个值为x的节点
N *dele_num(N *head,datatype x)
{N *pre=NULL,*p;if(!head){printf("该单链表是空的!");return head;}p=head;while(p && p->info!=x)/*没有找到并且没有找完*/{pre=p;p=p->next;/*pre指向p的前驱结点*/}if(p){if(!pre)/*要删除第一个结点*/{head=head->next;}else{pre->next=p->next;free(p);}}return head;
}//删除第i个结点
N *dele_node(N *head,int i)
{N *q,*p;if(!head){printf("该单链表是空的!");return head;}if(i==1){head=head->next;}else{q=find(head,i-1);p=find(head,i);q->next=p->next; }return head;
}void menu()
{printf("\t|===================================|\t\n");printf("\t| |\t\n");printf("\t| 单链表的相关操作 |\t\n");printf("\t| |\t\n");printf("\t|===================================|\t\n");printf("\t|有如下选项: |\t\n");printf("\t|===================================|\t\n");printf("\t|【1】初始化一个链表 |\t\n");printf("\t|【2】输出单链表中各结点的值 |\t\n");printf("\t|【3】在单链表中查找第i个结点 |\t\n");printf("\t|【4】在单链表中找值为i的结点的位置 |\t\n");printf("\t|【5】在第i个结点后插入值为x的新结点|\t\n");printf("\t|【6】删除值为x的结点 |\t\n");printf("\t|【7】删除第i个结点 |\t\n");printf("\t|===================================|\t\n");printf("\t|Ctrl+C结束该程序!!! |\t\n");printf("\t|===================================|\t\n");
}#endif // HEAD_LINK_H_INCLUDED
下面是主程序:
#include "stdio.h"
#include "stdlib.h"
#include "head_link.h"int main ()
{N *p,*q,*h1;int a,len,count,node_number,x,position;while(1){menu();printf("请选择数字:");scanf("%d",&a);switch(a){case 1:{printf("\n请输入初始列表的长度:");scanf("%d",&len);h1=creat(len);break;}case 2:{display(h1);printf("\n现在一共有%d个节点\n",counts(h1));break;}case 3:{printf("输入某个节点:");scanf("%d",&node_number);if(!(find(h1,node_number))){printf("找不到该结点!\n");}else{printf("%d\n",(find(h1,node_number))->info);}break;}case 4:{ scanf("%d",&x);if(node_position(h1,x)){printf("%d\n",node_position(h1,x));}else{printf("该链表中找不到该值!\n");}break;}case 5:{printf("\n请输入要插入的数:");scanf("%d",&x);printf("请输入要插入的位置:");scanf("%d",&position);h1=insert(h1,x,position);display(h1);break;}case 6:{printf("请输入要删除的值:");scanf("%d",&x);h1=dele_num(h1,x);display(h1);break;}case 7:{printf("当前有%d个结点,请输入要删除的结点:",counts(h1));scanf("%d",&node_number);h1=dele_node(h1,node_number);display(h1);break;}}}return 0;
}
【数据结构】单链表的实现(C语言)相关推荐
- 数据结构-单链表基本操作(C语言实现)
参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉) 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...
- 用c语言描述单链表的数据类型,数据结构—单链表(类C语言描述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不 ...
- 数据结构—单链表(类C语言描写叙述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不 ...
- 数据结构—单链表(类C语言描述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ...
- C语言数据结构单链表链表
数据结构–单链表 学习了顺序表,我们发现顺序表在向里面存放数据的时候很麻烦,比如我们要使用头插法存放一个数据到顺序表的时候,我们要将整个表都向后挪一位,这个操作就让人很难受.那么有没有一种结构可以让我 ...
- php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...
浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...
- 20175330 数据结构-单链表(选做)
要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList { public static void mai ...
- 数据结构——单链表的C++实现
数据结构--单链表的C++实现 \qquad单链表的创建.求长度.查找.插入和删除的C++实现. #include<iostream> using namespace std;//1.定义 ...
- php mysql 链表_浅谈PHP链表数据结构(单链表)
链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...
- python 单链表是否有回路_(Python3)数据结构--单链表之判断链表是否有环
前言 有Python基础 有数据结构单链表基础,没接触过的可以看下面链接 https://blog.csdn.net/sf9898/article/details/104946291 原理和实现 有一 ...
最新文章
- CC讲坛-大脑疾病背后的秘密-许执恒
- erhai系统使用_web
- 《UML用户指南第二版》再次温读笔记(一)(downmoon)
- 如何安装pylab:python如何导入matplotlib模块
- light task schedule的定时任务实现源码解析
- 点赞!刘强东:无论京东员工遭遇何种不幸,将负责其子女费用到22岁
- mysql6默认什么字符集_mysql默认字符集问题
- [设计模式-行为型]备忘录模式(Memento)
- Open3d之RGBD测程法
- Java基础知识框图总结
- python实验报告内容实现购物车系统_Python实现的购物车功能示例
- Yahoo!用户体验与设计前副总裁推荐——《设计模式》
- Dropbox的服务器和网络自动化运维实践
- ABBYY FineReader PDF for Mac(PDF转换工具)
- for能否作为matlab的变量名,matlab中for语句用法
- thinkpadt410接口介绍_独家:ThinkPad T410与T400之细节对比
- python自动登录路由器_Openwrt路由器使用Python自动登录北航校园网
- XSY contest1586 proB
- html项目的致谢词,毕业论文致谢词范文200字(精选10篇)
- 顺丰--Java丰桥接口整体封装(下单、查询、打印)