线性表的链式存储
单链表在数据结构中是很重要的部分,要熟练掌握其相关功能的操作。
链表:逻辑上连续,物理上不一定连续。
List.cpp
#include "List.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void Init_List(List plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
return ;
}
plist->next = 0;
}
bool Insert_List_Head(List plist,int val)
{
//申请结点
Node *p = (Node*)malloc(sizeof(Node));
p->data = val;
p->next = plist ->next;
plist->next = p;
return true;
}
bool Insert_List_Tail(List plist,int val)
{
Node *p = (Node*)malloc(sizeof(Node));
p->data = val;
//找尾结点
Node *q;
for(q= plist;q->next != NULL;q = q->next)
;
//将p插入在q的后面
p->next = q->next;//p->next = NULL;
q->next = p;
return true;
}
bool Delete_List(List plist,int key)
{
Node *p;
Node *q;
for(p = plist;p->next!=NULL;p = p->next)
{
if(p->next->data == key)
{
q = p->next;
//将q从链表中踢出
p->next = q->next;//p->next = p->next->next;等价
free(q);
return true;
}
}
return false;
}
void Show(List plist)
{
for(Node*p=plist->next;p!=NULL;p = p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
//销毁,回收内存
void Destroy(List plist)
{
Node *p;
while(plist->next !=NULL)
{
p = plist->next;
plist->next = p->next;
free(p);
}
}
void Clear(List plist)
{
Node *p = plist->next;
Node *q = p;
while(p !=NULL)
{
q = p->next;
free(p);
p = q;
}
plist ->next = NULL;
}
int GetLength(List plist)
{
int n = 0;
Node *p;
p = plist->next;
while(p!=NULL)
{
p = p->next;
n++;
}
return n;
}
void Reverse(List plist)
{
if(plist == NULL||plist->next == NULL||plist->next->next == NULL)
return;
Node*p = plist->next;
Node *q;
plist->next = NULL;
while(p!=NULL)
{
q = p->next;
//将p以头插的方式插入到plist中
p->next = plist->next;
plist->next = p;
p = q;
}
}
List.h
#ifndef _LIST_H
#define _LIST_H
//带头节点的单链表
//头节点的数据域不允许被使用
//尾节点的指针为空NULL
typedef struct Node
{
int data;//数据域
struct Node *next;
//8个字节
}Node,*List;//List(4个字节) = *Node
//初始化
void Init_List(List plist);
//头插
bool Insert_List_Head(List plist,int val);
//尾插
bool Insert_List_Tail(List plist,int val);//第一个数据结点的下标为0
//按元素删除结点
bool Delete_List(List plist,int key);
//打印
void Show(List plist);
//销毁
void Destroy(List plist);
//清空
void Clear(List plist);
//测长
int GetLength(List plist);
//单链表逆置
void Reverse(List plist);
#endif
main.cpp
#include <stdio.h>
#include "list.h"
int main()
{
/*List(al);
Init_List(&al);写法错误,存在野指针*/
Node head;
Init_List(&head);
for(int i = 0;i<10;i++)
{
Insert_List_Tail(&head,i);
}
//Delete_List(&head,1);
//Destroy(&head);
//Reverse(&head);
//Clear(&head);
Show(&head);
return 0;
}
运行结果: