#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define InitSize 5 // 默认的最大长度
typedef struct LNode{
int data ; //数据域
struct LNode *next; //指针域
}LNode, *LinkList;
// 带头结点的单链表的初始化
bool InitList(LinkList *L)
{
*L = (LNode*)malloc(sizeof(LNode));//创建头节点
(*L)->next = NULL; //头节点之后暂时还没有元素节点
return true;
}
//求表长
int Length(LinkList L)
{
int len = 0;
LNode * p = L;
while (p->next != NULL)
{
p = p->next;
len ++;
}
return len;
}
//按序号查找结点
LNode *GetElem(LinkList L, int i)
{
LNode *p= L;
int j = 0;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
return p;
}
//按值查找表结点
LNode *LocateElem(LinkList L, int e)
{
LNode *p = L->next;
while(p != NULL && p->data != e)
{
p = p->next;
}
return p;
}
//插入结点操作(在结点后插入)
bool ListInsert(LinkList L, int i, int e)
{
LNode *p= L;
int j = 0;
while (p != NULL && j < i-1)
{
p = p->next;
j++;
}
if(p == NULL)
{
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//删除结点
bool ListDelete(LinkList L, int i, int * e)
{
LNode * p = GetElem(L, i);
if(p == NULL || p->next == NULL)
{
return false;
}
LNode *q = p->next;
*e = q->data;
printf("删除第%d位值为%d的数\n", i+1, *e);
p->next = q->next;
free(q);
return true;
}
int main()
{
LinkList L = NULL;// 初始为空链表,不然会指向不确定的地方
InitList(&L);
ListInsert(L, 1, 1);
ListInsert(L, 2, 2);
ListInsert(L, 3, 3);
ListInsert(L, 4, 4);
ListInsert(L, 5, 5);
LNode * p = L;
for (; p->next != NULL; p = p->next)
{
printf("%d\n",p->next->data);
}
printf("%d\n",Length(L));
printf("%d\n",LocateElem(L, 3)->next->data);
int e = 0;
ListDelete(L, 2, &e);
printf("被删除的数的值为:%d\n", e);
p = L;
for (; p->next != NULL; p = p->next)
{
printf("%d\n",p->next->data);
}
return 0;
}