#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define MaxSize 10
#define true 1
#define false 0
typedef int bool;
//定义单链表节点
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList* L) {
*L = (LNode*)malloc(sizeof(LNode));
if (*L == NULL) {
return false;
}
(*L)->next = NULL;
return true;
}
//头插法建立链表
LinkList List_HeaderInsert(LinkList L) {
LNode* p;
int n, data;
printf("请输入你要添加元素的个数:");
scanf_s("%d", &n);
while (n) {
scanf_s("%d", &data);
p = (LNode*)malloc(sizeof(LNode));
p->data = data;
p->next = L->next;
L->next = p;
n--;
}
return L;
}
//获取指定节点
LNode* GetElem(LinkList L, int i) {
if (i < 0) {
return NULL;
}
int n = 1;
if (i == 0) {
return L;
}
LNode* p = L->next;
while (p) {
if (i == n) {
return p;
}
n++;
p = p->next;
}
return NULL;
}
//链表打印
void Print_LinkList(LinkList L) {
if (Is_Empty(L)) {
printf("链表为空");
return;
}
LNode* p = L->next;
int n = 0;
while (p!=NULL) {
if (n % 10 == 0 && n / 10 != 0) {
printf("\n");
}
printf("%d ", p->data);
p = p->next;
n++;
}
}
//判断是否为空
bool Is_Empty(LinkList L) {
if (L->next == NULL) {
return true;
}
return false;
}
//按位插入节点
bool ListInsert(LinkList L,int index,ElemType data) {
if (Is_Empty(L)||index<1) {
return false;
}
LNode* p = L->next;
int n = 1;
while (p) {
if (n == index) {
InsertPriorNode(p, data);
return true;
}
p = p->next;
n++;
}
return false;
}
//在指定节点后面插入
bool InsertNextNode(LNode* s, ElemType data) {
if (s == NULL) {
return false;
}
LNode* p = (LNode*)malloc(sizeof(LNode));
p->data = data;
p->next = s->next;
s->next = p;
return true;
}
//在指定节点前插入
bool InsertPriorNode(LNode* s, ElemType data) {
if (s == NULL) {
return false;
}
LNode* p = (LNode*)malloc(sizeof(LNode));
p->data = s->data;
p->next = s->next;
s->data = data;
s->next = p;
return true;
}
//按位删除节点
bool ListDelete(LinkList L, int index) {
if (Is_Empty(L) || index < 1) {
return false;
}
if (index == 1) {
LNode* p = L->next;
L->next = p->next;
free(p);
return true;
}
int n = 1;
LNode* p = L->next;
while (p) {
if (n == index-1) {
if (p->next == NULL) {
return false;
}
DeleteNode(p);
return true;
}
p = p->next;
n++;
}
return false;
}
//删除指定节点
bool DeleteNode(LNode* p) {
if (p == NULL) {
return false;
}
LNode* q = p->next;
p->next = q->next;
free(q);
return true;
}
//链表反转
bool ListReverse(LinkList *L) {
if (Is_Empty(L)) {
return false;
}
int n = 1;
LinkList K;
InitList(&K);
LNode* p = (*L)->next;
while (p) {
if (n == 1) {
LNode* q = (LNode*)malloc(sizeof(LNode));
q->data = p->data;
q->next = NULL;
K->next = q;
n = 2;
}
else {
InsertPriorNode(K->next, p->data);
}
p = p->next;
}
free(*L);
*L = K;
return true;
}
int main() {
LinkList L;
InitList(&L);
List_HeaderInsert(L);
Print_LinkList(L);
printf("\n");
printf("%d", (GetElem(L,1))->data);
printf("\n");
ListInsert(L, 1, 5);
Print_LinkList(L);
printf("\n");
ListDelete(L,2);
Print_LinkList(L);
printf("\n");
ListReverse(&L);
Print_LinkList(L);
}