单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据。链表中的数据是以结点来表示的,每个结点的构成:数据域+
结构图如下:
头文件list.h
#pragma once
//带头节点的单链表
typedef struct Node
{
int data;
struct Node *next;
}Node,*List;
void InitList(List plist);
//头插
bool Insert_head(List plist,int val);
//尾插
bool Insert_tail(List plist,int val);
//第一个数据节点的下标为0
bool Insert(List plist,int pos,int val);//一般不使用
bool IsEmpty(List plist);
bool Delete(List plist,int key);
Node * Search(List plist,int key);//List
void Show(List plist);
void Destroy(List plist);
void Clear(List plist);
//获取有效数据的个数
int GetLength(List plist);
//链表逆置
void Reverse(List plist);
具体实现List.cpp文件
#include<stdio.h>
#include"list.h"
#include<assert.h>
#include<stdlib.h>
#include<vld.h>
void InitList(List plist)//初始化
{
assert(plist!=NULL);
if(plist == NULL)
{
return ;
}
plist->next = NULL;//直接指向尾结点
}
bool Insert_head(List plist,int val)//头插
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
Node *p=(Node *)malloc(sizeof(Node));
p->data = val;
p->next = plist->next;
plist->next=p;
return true;
}
bool Insert_tail(List plist,int val)//尾插
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
Node *p;
for(p=plist;p->next!=NULL;p=p->next);//找尾巴
Node *q=(Node *)malloc(sizeof(Node));
q->data = val;
q->next=p->next;
p->next=q;
return true;
}
//第一个数据节点的下标为0
bool Insert(List plist,int pos,int val)//一般不使用
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
Node *p;
int i;
for(i=0,p=plist;i<pos&&p!=NULL;i++,p=p->next);//找pos前面的结点
Node *q=(Node *)malloc(sizeof(Node));
q->data = val;
q->next=p->next;
p->next=q;
return true;
}
bool IsEmpty(List plist)
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
return plist->next == NULL;
}
static Node *SearchPri(List plist,int key)//找前驱
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
Node *p;
for(p=plist;p->next!=NULL;p=p->next)
{
if(p->next->data == key)
{
return p;
}
}
return NULL;
}
bool Delete(List plist,int key)
{
assert(plist!=NULL);
if(plist == NULL)
{
return false;
}
Node *p=SearchPri(plist,key);
if(p == NULL)
{
return false;
}
Node *q=p->next;
p->next=q->next;
free(q);
return false;
}
Node * Search(List plist,int key)//List
{
for(Node *p=plist->next;p!=NULL;p=p->next)
{
if(p->data == key)
{
return p;
}
}
return NULL;
}
void Show(List plist)
{
Node *p;
for(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)
{
Destroy(plist);
}
//获取有效数据的个数
int GetLength(List plist)
{
Node *p;
int i;
for(i=0,p=plist->next;p!=NULL;p=p->next,i++);
return i;
}
//链表逆置
void Reverse(List plist)
{
Node *p = plist->next;
Node *q ;
plist->next = NULL;//****
while(p != NULL)
{
q = p->next;
//将p利用头插的方法插入到链表中
p->next = plist->next;
plist->next = p;
p = q;
}
}
测试test.cpp文件
int main()
{
Node n;
InitList(&n);
for(int i=10;i>=0;i--)
{
Insert_head(&n,i);
}
Delete(&n,0);
Show(&n);
Reverse(&n);
Show(&n);
Destroy(&n);
}