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

数据结构学习笔记-线性表链式存储(C语言实现)

2018-02-06 10:52 676 查看
写了两天,终于将线性表链式存储调通了,代码奉上:#include <stdio.h>
#include <stdlib.h>
//定义链表存放的数据类型
typedef int Eletype;
//定义组成链表的结构体
typedef struct Node{
Eletype data;
struct Node *next;
}Node;
//定义链表的头指针
typedef Node *LinkList;
//链表的常用操作方法:初始化、清空、检测链表是否为空、插入、删除
LinkList init(){
//定义头指针、要插入的结构体
LinkList l,s;
//定义指针类型的结构体
l=(LinkList)malloc(sizeof(Node));
//让链表最后一个节点的指针为空,也可以让他指向自己(循环链表)
l->next=NULL;
//循环生成要插入的数据
for(int i=1;i<6;i++){
//创建要插入的指针类型的结构体
s=(LinkList)malloc(sizeof(Node));
//给结构体赋值
s->data=i;
//把头指针的next给新生成的结构体
s->next=l->next;
//再让头指针指向该结构体,这样新生成的结构体一直就在前面
l->next=s;
}
}
void ClearAll(LinkList *l){
//定义两个指针类型的结构体
LinkList p,q;
//让p指向链表的第一个数据
p=(*l)->next;
//当第一个数据不为空
while(p){
//把p的next给q,再把p释放掉,再把q给p,这样是为了把链表所有数据都释放掉而不是只释放第一个数据,把后边的落下
q=p->next;
free(p);
p=q;
}
//把所有数据释放后,最后再让头指针指向空
(*l)->next=NULL;
}
int isEmpty(LinkList l){
if(l->next!=NULL){
return 1;
}else{
return 0;
}
}
void getEle(LinkList l,Eletype *e,int index){
LinkList p;
int i=1;
//让p指向链表第一个数据
p=l->next;
//当p存在并且要取的数据不是第一个时,就让p往下指
while(p&&i<index){
p=p->next;
i++;
}
*e=p->data;
}
void display(LinkList l,int length){
Eletype e;
printf("链表中的数据:\n");
for(int i=1;i<length;i++){
getEle(l,&e,i);
printf("%d ",e);
}
printf("\n");
}
void insertEle(LinkList *l,Eletype ele,int index){
LinkList p,s;
int i=1;
//定义一个指针指向头指针,比如想要在第一个位置插入,就要拿到第一个位置前面的节点。
//经过循环拿到要插入的位置前面的节点p
p=*l;
while(p&&i<index){
p=p->next;
i++;
}
//创建节点给他赋值
s=(LinkList)malloc(sizeof(Node));
s->data=ele;
//把新节点插进去
s->next=p->next;
p->next=s;
}
void deleteEle(LinkList *l,Eletype *e,int index){
LinkList p,s;
int i=1;
//定义一个指针指向头指针
p=*l;
//当它存在第一个数据并且要删除的节点不是第一个就循环往下指
while(p->next&&i<index){
p=p->next;
i++;
}
//p是要删除的节点前面的节点,拿到要删除的节点s,把的s的next给p的next,再给s释放掉
s=p->next;
*e=s->data;
p->next=s->next;
free(s);
}
int main()
{
printf("Hello world!\n");
LinkList ll;
Eletype s=100,e=6;
ll=init();
printf("链表是否为空:%d\n",isEmpty(ll));
display(ll,6);
insertEle(&ll,e,1);
display(ll,7);
deleteEle(&ll,&s,1);
display(ll,6);
printf("删除的数据:%d\n",s);
ClearAll(&ll);
printf("链表是否为空:%d\n",isEmpty(ll));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: