不带头结点单链表
有问题可以一起在评论区讨论
#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 = NULL;
/*ListHeadInsert(L);*/
ListTailInsert(L);
LNode* p = GetElem(L, 3);
/*printf("p->data = %d\n", p->data);*/
/*p = LocateElem(L, 2);
printf("p->data = %d\n", p->data);*/
/*printf("表长为:%d\n", Length(L));*/
Traverse(L);
/*ListInsert(L, 1, 8888);*/
/*InsertNextNode(p, 6666);*/
/*InsertPriorNode(p, 7777);*/
/*ElemType e;
ListDelete(L, 3, e);
printf("删除元素e = %d\n", e);*/
DeleteNode(L, p);
Traverse(L);
return 0;
}
LNode* GetElem(LinkList L, int i) {
if (i < 1) {
return NULL;
}
LNode* p = L;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, ElemType e) {
LNode* p = L;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
int Length(LinkList L) {
LNode* p = L;
int j = 0;
while (p != NULL) {
p = p->next;
j++;
}
return j;
}
bool ListInsert(LinkList& L, int i, ElemType e) {
if (i < 1) {
return false;
}
if (i == 1) {
if (L != NULL) {
return InsertPriorNode(L, e);
}
else {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) {
return false;
}
L->data = e;
L->next = NULL;
return true;
}
}
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;
}
//将前插操作变为后插操作
ElemType temp = p->data;
p->data = e;
return InsertNextNode(p, temp);
}
bool ListDelete(LinkList& L, int i, ElemType& e) {
if (i < 1 || L == NULL) {
return false;
}
if (i == 1) {
e = L->data;
LNode* s = L;
L = L->next;
free(s);
return true;
}
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 (L == p) {
L = p->next;
free(p);
return true;
}
if (p->next != NULL) {
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 = 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;
if (r != NULL) {
s->next = r->next;
r->next = s;
}
else {
s->next = NULL;
L = 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;
L = s;
scanf("%d", &x);
}
return true;
}
void Traverse(LinkList L) {
if (L == NULL) {
return;
}
LNode* p = L;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}