您的位置:首页 > 理论基础 > 数据结构算法

数据结构-单链表的实现

2018-01-26 10:55 113 查看
1.数据结构中,单链表也是很重要的一部分,单链表,顾名思义,就是像链子一样连接在一起的表。但是链表不一定都是连续存储的,它是通过一组地址任意存储单元存放线性表的数据元素,把存储单元称作一个节点。

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: