单链表的基本操作的实现
定义(个人看法):单向链表是通过指针的方式将个各个节点串联起来形成链式结构;
特点:具有插入和删除操作方便,但其访问链表中的元素没有顺序表快;
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode *LinkList;
struct LNode {
ElementType element;
struct LNode *next;
} LNode;
//**************定义操作**********************//
/*有头节点*/
LinkList InitList();
void PrtList(LinkList L);
LinkList List_HeadInsert(LinkList L, ElementType e);
LinkList List_TailInsert(LinkList L, LinkList P, ElementType e);
int List_Length(LinkList L);
int GetLocate(LinkList L, ElementType FindE);
int GetElement(LinkList L, int locate);
LinkList DeleteNode(LinkList L, ElementType e);
//******************************************//
int main() {
/*有头节点*/
LinkList List = InitList();//L指针用于指向该链表的表头
LinkList Point = List;
for (int i = 0; i < 5; i++) {
Point = List_TailInsert(List, Point, i);
}
List = DeleteNode(List, 5);
printf("%d\n", List_Length(List));
PrtList(List);
return 0;
}
//***********************实现操作********************************//
/*有头节点的*/
LinkList InitList() {
//含有头节点的初始化方法
LinkList NewNode = (LinkList) malloc(sizeof(LNode));
NewNode->next = NULL;
return NewNode;
}
LinkList List_HeadInsert(LinkList L, ElementType e) {
//前插建立单向链表
//L是一个指向结构体的指针
LinkList NewNode = (LinkList) malloc(sizeof(LNode));
NewNode->next = L->next;
L->next = NewNode;
NewNode->element = e;
//该指针指向表头
return L;
}
LinkList List_TailInsert(LinkList L, LinkList P, ElementType e) {
//后插建立单向链表
LinkList NewNode = (LinkList) malloc(sizeof(LNode));
P->next = NewNode;
P = NewNode;
NewNode->next = NULL;
NewNode->element = e;
return P;
}
void PrtList(LinkList L) {
//用于打印节点的元素值
LinkList TempCell = NULL;
do {
TempCell = L->next;
printf("Site:%p\tElement:%d ->\n", TempCell, TempCell->element);
L = TempCell;
} while (TempCell->next != NULL);
}
int List_Length(LinkList L) {
int counter = 0;
while (L->next != NULL) {
L = L->next;
counter++;
}
return counter;
}
int GetLocate(LinkList L, ElementType FindE) {
//通过元素获取该元素的位置
int counter = 0;
while (L != NULL) {
if (L->element == FindE)
return counter;
else {
counter++;
L = L->next;
}
}
return -1;
}
ElementType GetElement(LinkList L, int locate) {
//通过位置获取该位置的元素
if (locate > List_Length(L)) {
printf("Over this list of length");
return (ElementType) NULL;
} else {
locate = locate - 1;
while (locate >= 0) {
L = L->next;
locate--;
}
return L->element;
}
}
LinkList DeleteNode(LinkList L, ElementType e) {
LinkList P = L;
if (P->element == e) {
//当被删除的节点是头节点
L = P->next;
free(P);
return L;
}
while (P->next != NULL) {
if (P->next->element == e && P->next->next == NULL) {
//当被删除的节点是尾节点
free(P->next);
P->next = NULL;
return L;
}
if (P->next->element == e && P->next->next != NULL) {
//当删除的节点是中间节点
LinkList TempCell = NULL;
TempCell = P->next->next;
free(P->next);
P->next = TempCell;
return L;
}
P = P->next;
}
printf("Not find the node!!");
//返回指针的时候不要随便返回NULL!!!!!
return L;
}
//**********************#end********************************//