ADT
链表等高级数据表示
Demo
/** 线性表 - 单链表 - 带头结点 - 头插法与尾插法
* 内容包括:
* 带头结点的单链表的定义
* 头插法
* 尾插法
* 销毁
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 链式储存类型定义
#define InitSize 10 // 默认最大长度
typedef struct LNode
{
int data;
struct LNode *next ;
}LNode, *LinkList;
// 输出操作
bool PrintList(LinkList L){
LNode* p = L->next;
if(p==NULL) return false;
do{
printf("%d ",p->data);
p = p->next;
}while(p!=NULL);
printf("\n");
return true;
}
// 销毁
void DestroyList(LinkList &L)
{
LNode *p = L, *q = L;
while(p){
q=p;
p = p->next;
free(q);
}
L=NULL;
}
// 头插法 (包含初始化)
LinkList List_HeadInsert(LinkList &L)
{
// 初始化
L = (LNode*)malloc(sizeof(LNode)); // 0
if(L==NULL) return L; // 内存不足
L->next=NULL; // 进行初始化 如果初始化, 可能指向随机的内存.
// 添加结点
fflush(stdin);
int x,count=0;
LNode* s;
while(InitSize>count && scanf("%d",&x))
{
s = (LNode*)malloc(sizeof(LNode));
if(s==NULL) return L; // 内存不足
s->data = x;
s->next = L->next;
L->next = s;
count++;
}
return L;
}
// 尾插法 (包含初始化)
LinkList List_TailInsert(LinkList &L)
{
// 初始化
L = (LNode*)malloc(sizeof(LNode));
if(L==NULL) return L; // 内存不足
//L->next=NULL; // 进行初始化 - 尾插法可以不加, 但最好都加上, 养成好习惯.
// 添加结点
fflush(stdin);
int x,count=0;
LNode* p = L;
while(InitSize>count && scanf("%d",&x))
{
// 对头节点进行后插操作
p->next = (LNode*)malloc(sizeof(LNode));
if(p->next==NULL) return L; // 内存不足
p->next->data = x;
p = p->next;
count++;
}
p->next = NULL;
return L;
}
// 链表逆置
LinkList List_Inverse(LinkList &L1){
// 头插法的性质应用
// 初始化新链表
LinkList L2 = (LNode*)malloc(sizeof(LNode));
L2->next = NULL;
// 逆置
LNode* p = L1->next;
while(p!=NULL){
// 分配新节点
LNode* s = (LNode*)malloc(sizeof(LNode));
if(s==NULL)
return L2;
// 赋值
s->next = L2->next;
s->data = p->data;
L2->next = s;
// 移动
p = p->next;
}
return L2;
}
int main(void){
printf("线性表 - 单链表 - 头插法\n");
// 单链表 - 带头结点
LinkList L1;
// 头插法
List_HeadInsert(L1);
// 打印
PrintList(L1);
// 练习 - 链表逆置
LinkList L3 = List_Inverse(L1);
printf("练习 - 链表逆置\n");
PrintList(L3);
// 销毁
DestroyList(L1);
printf("线性表 - 单链表 - 尾插法\n");
// 单链表 - 带头结点
LinkList L2;
// 尾插法
List_TailInsert(L2);
// 打印
PrintList(L2);
// 销毁
DestroyList(L2);
return 0;
}后边衔接数据结构了,请看我的 github:https://github.com/CharlesShan-hub/DataStructureNotes
最后更新于
这有帮助吗?