数据结构-单链表的实现
2018-01-26 10:55
113 查看
1.数据结构中,单链表也是很重要的一部分,单链表,顾名思义,就是像链子一样连接在一起的表。但是链表不一定都是连续存储的,它是通过一组地址任意存储单元存放线性表的数据元素,把存储单元称作一个节点。
2.(类别)链表可以分为单链表,双链表还有双向循环链表,这三种链表的实现特征是相同的,但是中间还是有一些不同,今天我就把我所学到的单链表的知识分享给大家。
3.(与顺序表的区别)单链表不同于顺序表的地方在于,单链表有两个域,一个是数据域,里面存放的是数据,而另一个是指针域,也就是指向下一个元素的地址,只有这样,一个链表才可以被连接起来。单链表可以带头结点也可以不带头结点,这两点的不同就在于,如果带头结点的话,它的头结点为空,而头结点的next指向第一个元素,这点没有什么区别。
4.(单链表的建立)单链表的实现和顺序表也是很类似的,需要先定义一个结构体,然后再初始化开辟一块空间,随后进行空链表的数据插入,在插入之后也可以执行删除操作,因为单链表也是在堆上开辟的动态空间,所以一定要记得释放空间,不然很有可能会造成内存空间的丢失,更可怕的,还有可能形成野指针,这会给程序的编写造成很大的麻烦,下面我就把代码附上。
5.(代码实现)
2.(类别)链表可以分为单链表,双链表还有双向循环链表,这三种链表的实现特征是相同的,但是中间还是有一些不同,今天我就把我所学到的单链表的知识分享给大家。
3.(与顺序表的区别)单链表不同于顺序表的地方在于,单链表有两个域,一个是数据域,里面存放的是数据,而另一个是指针域,也就是指向下一个元素的地址,只有这样,一个链表才可以被连接起来。单链表可以带头结点也可以不带头结点,这两点的不同就在于,如果带头结点的话,它的头结点为空,而头结点的next指向第一个元素,这点没有什么区别。
4.(单链表的建立)单链表的实现和顺序表也是很类似的,需要先定义一个结构体,然后再初始化开辟一块空间,随后进行空链表的数据插入,在插入之后也可以执行删除操作,因为单链表也是在堆上开辟的动态空间,所以一定要记得释放空间,不然很有可能会造成内存空间的丢失,更可怕的,还有可能形成野指针,这会给程序的编写造成很大的麻烦,下面我就把代码附上。
5.(代码实现)
#include<stdio.h> //头文件 #include<stdlib.h> #include<malloc.h> typedef int DataType; typedef struct Node { DataType data; struct Node *next; }SLNode; void ListInitiate(SLNode **head) //初始化单链表 { *head=(SLNode*)malloc(sizeof(SLNode)); (*head)->next =NULL; } int ListLength(SLNode *head)//计算长度 { SLNode *p=head; int size=0; while(p->next !=NULL) { p=p->next; size++; } return size; } int ListInsert(SLNode *head,int i,DataType x)//插入数据 { SLNode *p,*q; int j; p=head; j=-1; while(p->next!=NULL &&j<i-1) { p=p->next; j++; } if(j!=i-1) //判断插入位置是否合法 { printf("插入位置参数错!"); return 0; } q=(SLNode*)malloc(sizeof(SLNode)); q->data=x; q->next=p->next; p->next=q; return 1; } int ListDelete(SLNode *head,int i,DataType *x)//删除函数 { SLNode *p,*s; int j; p=head; j=-1; while(p->next!=NULL &&p->next->next !=NULL && j<i-1) { p=p->next; j++; } if(j!=i-1) //判断删除位置是否合法 { printf("删除位置参数错!"); return 0; } s=p->next; *x=s->data; p->next=p->next->next; free(s); return 1; } int ListGet(SLNode *head,int i,DataType *x)//输出数据函数 { SLNode *p; int j; p=head; j=-1; while(p->next !=NULL &&j <i) { p=p->next; j++; } if(j!=i) { printf("取元素位置错!"); return 0; } *x=p->data; return 1; } void Destroy(SLNode **head)//销毁内存空间,以免造成内存泄漏 { SLNode *p, *p1; p=*head; while(p!= NULL) { p1=p; p=p->next; free(p1); } *head=NULL; } void main() //主函数 { SLNode *head; int i,x; ListInitiate(&head); for(i=0;i<10;i++) ListInsert(head,i,i+1); ListDelete(head,4,&x); for(i=0;i<ListLength(head);i++) { ListGet(head,i,&x); printf("%d ",x); } Destroy(&head); system("pause"); }
相关文章推荐
- 【C++数据结构】几种单链表的模类板实现及基本操作
- [数据结构]线性表之单链表的类模板实现
- 数据结构之链表---单链表的实现
- 基本数据结构(C#实现):单链表
- 数据结构基础之单链表基本操作实现
- 数据结构-单链表的java实现
- 数据结构C++单链表的实现
- 数据结构c++实现----单链表
- 数据结构_完成单链表的后续操作实现
- 笔试面试常考数据结构-单链表常用操作编程实现
- (Java)单链表Java语言顺序结构实现(数据结构三)
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)
- 【数据结构】用C++实现单链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 数据结构(一) 单链表的实现-JAVA
- (Java)单链表Java语言顺序结构实现(数据结构三)
- java实现数据结构单链表示例(java单链表)
- 数据结构的Java实现——单链表
- python数据结构学习笔记-2016-10-27-02-使用单链表实现包ADT
- 【自己动手写数据结构】 -- 单链表的实现
- 数据结构c语言实现之单链表的应用