线性表——链式
#pragma once
/*线性表——链式
带头结点——同样以0位第一个元素
代码实现
void *malloc(unsigned size)//动态申请内存
void free(void *p)//释放动态申请的内存空间
sizeof(<已定义的数据类型>)//返回字节个数
*/
//实验例子
//#include<stdio.h>
//#include<malloc.h>
//typedef int DataType;
//#include"LinList.h"
//
//void main(void) {
// 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);
//}
typedef DataType;//如果这里不定义,要在外面定义,否则会报错
//单链表节点定义
typedef struct Node {
DataType data;
struct Node* next;
}SLNode;
//初始化
void ListInitiate(SLNode** head) {
//申请头结点,由head指示其地址
*head = (SLNode*)malloc(sizeof(SLNode));
//置结束标记NULL
(*head)->next = NULL;
}
//求当前数据元素个数
//返回整型个数
int ListLength(SLNode* head) {
SLNode* p = head;
int size = 0;//指向头结点时为0;头结点不计入
while (p->next != NULL) {
p = p->next;
size++;
}
return size;
}
//在带头结点的单链表head的第i(0<=i<=size)个结点前插入一个存放数据元素x的结点
//插入成功返回1,失败返回0
int ListInsert(SLNode* head, int i, DataType x) {
SLNode* p, * q;
int j;
p = head;
j = -1;
while (p->next != NULL && j < i - 1) {
//最终让指针指向第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;//插入步骤1
p->next = q; //插入步骤2
return 1;
}
//删除带头结点单链表head的第i(0<=i<=size)个结点//头结点下标为-1
//被删除结点的数据域有x带回,删除成功则返回1,失败返回0
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) {
//循环结束时指针指向第i-1个结点
p = p->next;
j++;
}
if (j != i - 1) {
printf("删除元素位置参数错误!");
return 0;
}
s = p->next;//指针s指向ai结点
*x = s->data;//把指针s所指结点的数据域赋值给x
p->next = p->next->next;//删除
free(s);//释放指针s所指结点的内存空间
return 1;
}
//获取第i个数据元素
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;
}