带头结点单链表
有问题可以一起在评论区讨论
#include<stdio.h>
#include<malloc.h>
#define _CRT_SECURE_NO_WARNINGS
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//按位查找
LNode* GetElem(LinkList, int);
//按值查找
LNode* LocateElem(LinkList, ElemType);
//求表长
int Length(LinkList);
//按位序插入
bool ListInsert(LinkList&, int, ElemType);
//指定结点后插操作
bool InsertNextNode(LNode*, ElemType);
//指定结点前插操作(使用之前最好判断一下该结点是否为头节点)
bool InsertPriorNode(LNode*, ElemType);
//按位序删除
bool ListDelete(LinkList&, int, ElemType&);
//指定结点删除
bool DeleteNode(LinkList &, LNode*);
//初始化单链表
bool InitList(LinkList&);
//尾插法建立单链表
bool ListTailInsert(LinkList&);
//头插法建立单链表
bool ListHeadInsert(LinkList&);
//遍历链表
void Traverse(LinkList);
int main(void) {
LinkList L;
//ListTailInsert(L);
ListHeadInsert(L);
Traverse(L);
printf("表长为:%d\n", Length(L));
LNode* p;
p = GetElem(L, 1);
printf("p->data = %d\n", p->data);
/*p = LocateElem(L, 1);
printf("p->data = %d\n", p->data);*/
/*ListInsert(L, 5, 8888);
Traverse(L);*/
/*InsertNextNode(p, 7777);
Traverse(L);*/
/*InsertPriorNode(p, 0);*/
/*ElemType e;
ListDelete(L, 1, e);
printf("删除e = %d\n", e);*/
DeleteNode(L, p);
Traverse(L);
return 0;
}
LNode* GetElem(LinkList L, int i) {
if (i < 0) {
return NULL;
}
LNode* p = L;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, ElemType e) {
if (L != NULL) {
return NULL;
}
LNode* p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
int Length(LinkList L) {
LNode* p = L;
int j = -1;
while (p != NULL) {
p = p->next;
j++;
}
return j;
}
bool ListInsert(LinkList& L, int i, ElemType e) {
if (i < 1) {
return false;
}
LNode* p = GetElem(L, i - 1);
return InsertNextNode(p,e);
}
bool InsertNextNode(LNode* p, ElemType e) {
if (p == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool InsertPriorNode(LNode* p, ElemType e) {
if (p == NULL) {
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = p->data;
p->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList& L, int i, ElemType& e) {
if (i < 1) {
return false;
}
LNode* p = GetElem(L, i - 1);
if (p == NULL || p->next == NULL) {
return false;
}
LNode* s = p->next;
e = s->data;
p->next = s->next;
free(s);
return true;
}
bool DeleteNode(LinkList& L, LNode* p) {
if (p == NULL || L == NULL) {
return false;
}
if (p == L && L->next != NULL) {
return false;
}
if (p == L && p->next == NULL) { //链表只有头节点了
free(L);
L = NULL;
return true;
}
if (p->next != NULL) { //判断p是否为最后一个结点
LNode* s = p->next;
p->data = s->data;
p->next = s->next;
free(s);
}
else {
LNode* s = L;
while (s->next != p) {
s = s->next;
}
s->next = NULL;
free(p);
}
return true;
}
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) {
return false;
}
L->next = NULL;
return true;
}
bool ListTailInsert(LinkList& L) {
if (!InitList(L)) {
return false;
}
ElemType x;
LNode* s, * r = L;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = x;
s->next = r->next;
r->next = s;
r = s;
scanf("%d", &x);
}
return true;
}
bool ListHeadInsert(LinkList& L) {
if (!InitList(L)) {
return false;
}
LNode* s;
ElemType x;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return true;
}
void Traverse(LinkList L) {
if (L == NULL) {
return;
}
LNode* p = L->next;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}