实现单链表的初始化,创建,输入,打印出它结点的数据域,求长度,查找某个值在不在其中,插入结点(表头、中间或结尾都可以),删除结点,释放整个链表。
先建框架,写头文件Linkling.h:
#define _CRT_SECURE_NO_WARNINGS//防止scanf报错
#include<stdio.h>
#include<stdlib.h>
#pragma once
/*单链表创建、输入、打印、
求长度、查找、插入、删除、释放*/
//1链表的存储结构
typedef int ElemType;
typedef struct LNode { //链表结点
ElemType data; //node数据域
struct LNode* next; //node链域
} LNode, *LinkList;
typedef LNode* LinkList; //链头指针
//使用时定义实际链表,只需定义链表头指针
//2初始化
void InitList(LinkList& L);
//3创建可输入值的链表
void CreateList_Tail(LinkList L, int n);
//4打印链表的值
void Print(LinkList& L);
//5求长度
int Len(const LinkList L);
//6查找
LinkList Find(const LinkList L, ElemType x);
//7插入
bool Insert(LinkList& L, ElemType y, int i);
//8删除
bool Delete(LinkList& L, int di, ElemType& z);
//9释放
void FreeList(LinkList& L);
现在就来添砖加瓦,好好搬砖,写个LinkedList的源文件:
#include"LinkedList.h"
void InitList(LinkList& L)
{
L = new LNode;
L->next = NULL;
}
void CreateList_Tail(LinkList L, int n) {
LinkList r, p;
r = L;
r->next = NULL;
int a;
for (int i = 0; i < n; ++i) {
p = new LNode;
scanf("%d", &a);
p->data = a;
p->next = NULL;
r->next = p;
r = p;
}
}
void Print( LinkList& L)
{
LNode* p = L->next;
while(p) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
int Len(const LinkList L)
{
LinkList p;
p = L->next;
int count = 0;
while (p) {
p = p->next;
count++;
}
return(count);
}
LinkList Find(const LinkList L, ElemType x)
{
LinkList p;
p = L->next;
int k = 1;
while (p && p->data != x)
{
p = p->next;
k++;
}
if (p == NULL)
printf("%d is not in list\n",x);
else printf("%d在第%d个结点\n",x, k);
printf("%d", L->data);
return p;
}
bool Insert(LinkList& L, ElemType y, int i) {
//使插入的y成为第i个结点的值,第一个i就是1了,不是0哦
LinkList p = L;
int k = 0;
while (p && k < i - 1)
{
p = p->next; k++;
} //找第 i-1个结点
if (p == NULL && L != NULL) {
printf("无效的插入位置!\n");
return 0; //给的 i 太大
}
LinkList newnode = new LNode;
//创建新结点
newnode->data = y;
if (L == NULL || i == 0) {
newnode->next = L;
L = newnode;
} //L 定义为引用型
else { //插在表中或末尾
newnode->next = p->next;
p->next = newnode;
}
return 1;
}
bool Delete(LinkList& L, int di, ElemType& z) {
/*在链表中删除第 i 个结点。如果要删除表中第1个结点,需要改变表头指针,所以 L定义为引用
型,被删元素的值通过引用型参数 x 返回*/
if (!L) return 0;
LinkList p, q;
if (di == 0) //删除表中第 1 号结点
{
q = L->next;
}
else {
p = L; int k = 0; //找第 i-1个结点
while (p && k < di - 1)
{
p = p->next;
k++;
}
if (p == NULL || p->next == NULL) {
printf("无效的删除位置!\n");
return 0;
}
else { //删除表中或表尾元素
q = p->next; //重新链接
p->next = q->next;
}
z = q->data;
delete q; //删除q
return 1; //delete作用与free相同
}
}
void FreeList(LinkList& L) {
LNode * current = L;
if (current == NULL) {
printf("List is empty\n");
return;
}
while (L) {
current = L;
if (!L->next) {
break;
}
L = L->next;
free(current);
}
printf("free done!");
}
最后,再建一个主函数main.cpp就可以来运行了:
#include"LinkedList.h"
int main() {
LinkList L;
InitList(L);
printf("input 3 integers and click'Enter':");//这里也可以自己做个scanf输入n的值,和下面的y,z一种办法。
CreateList_Tail(L, 3);
printf("list now:\n"); Print(L); printf("\n");
printf("length of list:%d\n", Len(L)); printf("\n");
ElemType x;
printf("input the value you want to find in the list:");
scanf("%d", &x);
Find(L, x);
ElemType y; int i;
printf("input the value you want to insert and the order:'v,o':");
scanf("%d,%d", &y,&i);//这里输入时中间要加逗号
Insert(L, y,i);
printf("inserted list:\n");
Print(L);
printf("\n");
ElemType z; int di;
printf("input the order of the delete elem:");
scanf("%d", &di);
Delete(L, di, z);
printf("deleted list:\n");
Print(L);
printf("\n");
FreeList(L);
return 0;
}
OK!