【数据结构】链表的实现(带头节点)
来源:互联网 发布:html5media.min.js 编辑:程序博客网 时间:2024/06/05 05:34
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,每个结点包括数据域和指针域。
此处是带头结点的链表。
- 结点结构体定义
typedef struct Linklist{ int data;//将int改为任何类型都可 struct Linklist *next;}LL;
链表的建立
头插法
LL *headcreate_list(int n){LL *p,*q;p=NULL;srand(time(0));for(int i=0;i<=n;i++){ q=(LL *)malloc(sizeof(LL)); q->data=rand()/1000; q->next=p; p=q;} return p;}
尾插法
LL *create_list(int n){LL *p,*r,*q;p=(LL*)malloc(sizeof(LL));p->next=NULL;r=p;srand(time(0));for(int i=1;i<=n;i++){ q=(LL*)malloc(sizeof(LL)); q->data=rand()/1000; q->next=r->next; r->next=q; r=q;}return p;//p是头节点 }
链表元素的插入
LL *insert_list(LL *p,int place,int e){ LL *q,*s;int j; q=p;j=1; while(j<place){ q=q->next; j++; } s=(LL*)malloc(sizeof(LL)); s->data=e; s->next=q->next; q->next=s; return p;}
- 链表元素的删除
LL *delete_list(LL *p,int place){ int e,j=1; LL *q,*r; q=p; while(j<place){ q=q->next; j++; } e=q->next->data; printf("被删除的元素为:%d\n",e); r=q->next; q->next=q->next->next; free(r); return p;}
- 寻找元素在链表的位置
int LOCATE (LL *p,int e){ int i; LL *q; if(p){ i=1; q=p->next; while(q){ if(q->data==e) return i; i++; q=q->next; } } return 0;}
- 求链表长度
int LENGTH(LL *p){ LL *q; int n=0; if(p){ q=p->next; while(q){ n++; q=q->next; } } return n;}
- 链表逆置
LL *nizhi(LL *head){ //链表的逆置 LL *p,*pnext; p=head->next; head->next=NULL; while(p){ pnext=p->next; p->next=head->next; head->next=p; p=pnext; } return head;}
- 打印链表
void print_list(LL *p){ LL *q; q=p->next; if(!q) printf("Empty list."); else while(q){ printf("%d ",q->data); q=q->next; } printf("\n");}
完整代码实现:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>typedef struct Linklist{ int data; struct Linklist *next;}LL;LL *create_list(int n);//尾插法 创建链表 LL *headcreate_list(int n);//头插法 创建链表 void print_list(LL *p);//打印链表 LL *insert_list(LL *p,int place,int e);//把e插入place位置LL *delete_list(LL *p,int place);//把place位置删除 int LOCATE(LL *p,int e);//寻找位置 int LENGTH(LL *p); //求长度 LL *nizhi(LL *p); //单链表的逆置 int main(){ LL *head; int e,n,place1,place2; printf("请输入建立链表元素个数:\n"); scanf("%d",&n); //head=create_list(n); head=headcreate_list(n); printf("创建的链表为:\n"); print_list(head); printf("插入的位置和元素:\n"); scanf("%d %d",&place1,&e); printf("插入后的链表:\n"); head=insert_list(head,place1,e); print_list(head); printf("删除的位置:\n"); scanf("%d",&place2); head=delete_list(head,place2); printf("删除后的链表:\n"); print_list(head); printf("请输入要查找的数:") ; int ha; scanf("%d",&ha); int pl=LOCATE(head,ha); printf("此元素在第%d个位置处\n",pl); int shu=LENGTH(head); printf("此时链表有%d个元素\n",shu); head=nizhi(head); printf("\n\n"); printf("输出逆置链表:\n"); print_list(head); return 0;}LL *create_list(int n){ LL *p,*r,*q; p=(LL*)malloc(sizeof(LL)); p->next=NULL; r=p; srand(time(0)); for(int i=1;i<=n;i++){ q=(LL*)malloc(sizeof(LL)); q->data=rand()/1000; q->next=r->next; r->next=q; r=q; } return p;//p是头节点 }void print_list(LL *p){ LL *q; q=p->next; if(!q) printf("Empty list."); else while(q){ printf("%d ",q->data); q=q->next; } printf("\n");}LL *insert_list(LL *p,int place,int e){ LL *q,*s;int j; q=p;j=1; while(j<place){ q=q->next; j++; } s=(LL*)malloc(sizeof(LL)); s->data=e; s->next=q->next; q->next=s; return p;}LL *delete_list(LL *p,int place){ int e,j=1; LL *q,*r; q=p; while(j<place){ q=q->next; j++; } e=q->next->data; printf("被删除的元素为:%d\n",e); r=q->next; q->next=q->next->next; free(r); return p;}LL *headcreate_list(int n){ LL *p,*q; p=NULL; srand(time(0)); for(int i=0;i<=n;i++){ q=(LL *)malloc(sizeof(LL)); q->data=rand()/1000; q->next=p; p=q; } return p;} int LOCATE (LL *p,int e){ int i; LL *q; if(p){ i=1; q=p->next; while(q){ if(q->data==e) return i; i++; q=q->next; } } return 0;}int LENGTH(LL *p){ LL *q; int n=0; if(p){ q=p->next; while(q){ n++; q=q->next; } } return n;}LL *nizhi(LL *head){ //链表的逆置 LL *p,*pnext; p=head->next; head->next=NULL; while(p){ pnext=p->next; p->next=head->next; head->next=p; p=pnext; } return head;}
阅读全文
0 0
- 【数据结构】链表的实现(带头节点)
- 数据结构示例之带头节点的双向循环链表
- 数据结构示例之带头节点的、单循环链表
- 数据结构示例之带头节点的双向循环链表
- 带头节点的链表
- 带头节点和不带头节点的链表
- 带头节点的双向循环链表(数据结构)(带有遍历)
- 链表的创建(带头节点以及不带头节点)
- 数据结构双语课->不带头节点的单链表实现
- 【C++】模板实现带头节点的双向循环链表
- 单链表的实现(不带头节点)
- 带头节点链表实例(C语言实现)
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之双链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之循环双链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)
- 数据结构(十五) 线索二叉树讲解(带头节点中序加线索) 以及实现的完整代码
- G
- 杭电 OJ 1157
- 二叉树
- java项目几种常见数据库连接池的使用比较
- 数组的排序
- 【数据结构】链表的实现(带头节点)
- HDU 6047 Maximum Sequence (贪心)
- 第003讲:插曲之变量和字符串 ---学习笔记
- InfluxDB使用总结与性能优化
- HDU_【2017 Multi-University Training Contest 1】——1003 color tree
- 设计模式-单例模式
- 整数拆分 生成函数 模版
- 百度地图API使用——基础地图
- java.lang.IllegalArgumentException: Comparison method violates its general contract!