c语言链表详解 超详细(C语言中链表的具体用途)
本文目录
C语言中链表的具体用途
链表是一种数据结构 是一种线形的存储结构 转一个小文章 C/C++ code 准备:动态内存分配 一、为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组: float score; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大? 在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大意兄弟几个当初一家子,都在一块住,这就是数组 后来都成家了,在一起住不方便,就各自分开住了,但形式上还是一家,这就是链表
c语言链表的用途是什么
1、链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。2、例程:
/**对链表的综合操作*功能有建立,排序,插入,删除,输出*/#include《stdio.h》#include《malloc.h》typedef int ElemType;typedef struct NodeType{ElemType data;struct NodeType *next;} NodeType,*LinkType;LinkType create(){//建立链表,返回链表的首地址,头结点没有数据LinkType head,p1,p2;head=(LinkType)malloc(sizeof(NodeType));p1=head;while(p1-》data!=0)//当data=0时链表结束{p2=p1;p1=(LinkType)malloc(sizeof(NodeType));printf("Enter student’s information:\ndata=");scanf("%d",&p1-》data);p2-》next=p1;}p2-》next=NULL;free(p1);return(head);}void output(LinkType head){//链表的输出,接收链表的首地址head=head-》next;while(head!=NULL){printf("data=%d\n",head-》data);head=head-》next;}}LinkType sort(LinkType head){//链表排序,接收链表首地址,返回链表首地址LinkType ph,p1;ElemType temp;ph=head-》next;p1=head-》next;while(p1-》next!=NULL)//冒泡法{ph=head;while(ph-》next!=NULL){if(ph-》data》ph-》next-》data)//按data由小到大排序{temp=ph-》data;ph-》data=ph-》next-》data;ph-》next-》data=temp;}ph=ph-》next;}p1=p1-》next;}return(head);}LinkType del(LinkType head){//删除结点,接收链表的首地址,返回链表的首地址ElemType DelData;LinkType ph,p;ph=head-》next;printf("Enter the data you want to del:\nDelData=");scanf("%d",&DelData);while(ph!=NULL && ph-》data!=DelData)//寻找要删除的结点{p=ph;ph=ph-》next;}if(ph==NULL)//没有找到要删除的结点{printf("Enter error!\n");return(head);}else{if(ph==head-》next)//删除头结点{head-》next=ph-》next;}else//删除其它结点{p-》next=ph-》next;}}free(ph);return(head);}LinkType insert(LinkType head){//插入结点,接收链表首地址,返回链表首地址LinkType ph,p,insert,temp;insert=(LinkType)malloc(sizeof(NodeType));printf("Enter the data you want to insert:\ndata=");scanf("%d",&insert-》data);ph=head-》next;while(ph!=NULL && ph-》data 《 insert-》data)//寻找插入的位置{p=ph;ph=ph-》next;}if(head-》next-》data 》 insert-》data)//插入头部{temp=head-》next;head-》next=insert;insert-》next=temp;}else//插入到其它地方{p-》next=insert;insert-》next=ph;}return(head);}void main(){LinkType head;head=create();output(head);printf("\n\n");head=sort(head);output(head);printf("\n\n");head=del(head);output(head);printf("\n\n");head=insert(head);output(head);}
C语言链表求解释
// 按照 x 的值,将其插入 h 指向的链表的合适位置(注:h 链表是从小到大排序的)void fun(SLIST *h, int x){ // 定义变量SLIST *p, *q, *s;// 创建新节点(注:实际上是为新节点分配内存)s = (SLIST *)malloc(sizeof(SLIST));// 将 x 的值存储在新节点的 data 成员中s-》data = x;// 准备遍历链表q = h;p = h-》next;// 遍历链表,直到结尾或找到比 x 大的节点while (p != NULL && x》p-》data) {q = p;p = p-》next;}// 将新节点插入s-》next = p;q-》next = s;}
C语言数据结构与算法:链表
先搞清楚基本概念,不懂再问
// 返回一个带头结点的且具有五个结点的链表 link *initLink(){ link * p=(link*)malloc(sizeof(link)); // 创建头结点 link * temp=p; // 使用变量temp在下面创建结点时指向链表末端 for(int i=1; i《5; i++) { link *a=(link*)malloc(sizeof(link)); // 创建一个结点 a-》elem=i; // 为结点赋值 a-》next=NULL; // 指针域暂时赋为NULL,若后面还要创建结点的话再修改 temp-》next=a; // 因为temp指向链表末端,即最后一个结点 // 故该节点指针域应指向刚才创建的结点 a temp=temp-》next;// 连接好以后,temp指向下一个结点(刚才创建的结点a,现在是链表末端) } return p; // 返回头结点 }