#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int 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;
}
//初始化一个不带头节点的单链表
/*bool InitList(LinkList L)
{
L = NULL;
return true
} */
//按位序插入节点
bool ListInsert(LinkList L , int i , int e) {
if (i<1)
return false;
LNode *s = L;
s = L; //为什么要定义一个指针变量s并把L的地址赋给s
int j = 0;
LNode *p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return false;
while (s!=NULL && j<i-1) {
s = s->next ;
j ++;
}
p->next = s->next ;
s->next = p;
p->data = e;
return true;
}
//不带头结点 按位序插入节点特例为第一个位置
/*bool InsertList(LinkList l,int i,int e)
{
if (i == 1)
LNode *s = (LNode *)malloc(sizeof(LNode));
s->next = L;
s->data = e;
L = s; //此时s已经为链表第一个元素,l=s 为l等于链表第一个元素的地址
}*/
//指定节点后插
bool InsertNextNode(LNode *p,int e)
{
if (p == NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->next = p->next ;
s->data = e;
p->next = s;
return true;
}
//指定节点前插
bool InesrtPriorNode(LNode *p,int e)
{
if (p == NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->next = p->next ;
p->next = s;
s->data = p->data ;
p->data = e;
return true;
}
//按位序删除
bool ListDelete(LinkList L , int i , int *e)
{
if (i<1)
return false;
//找位序第i-1个节点
int j =0;
LNode *p;
p = L;
while(p!=NULL&j<i-1)
{
p = p->next ;
j++;
}
LNode *q;
q = p->next ; //q为p的下一个节点
*e = q->data ;
p->next = q->next ;
free (q);
return true;
}
//指定节点删除
bool DeleteNode(LNode *p)
{
LNode *q = +p->next ;
p->data = q->data ; //q为p的下一个节点 p的data等于q p的next=q相当去p的下一个节点把p覆盖了
p->next = q->next ;
free(q);
return true;
}
//按位查找
LNode *GetElem(LinkList L,int i)
{
if (i<0)
return NULL;
int j = 0;
LNode *p;
p = L;
while(p!=NULL&&j<i)
{
p=p->next ;
j++;
}
return p;
}
//按值查找
LNode *LocateElem(LinkList L,int e)
{
LNode *p = L;
while(p != NULL && p->data != e)
p = p->next;
return p;
}
//头插法建立单链表
LinkList List_HeadInesrt(LinkList L)
{
LNode *p ;
int x;
scanf("请输入插入的数;%d",x);
while(x!=496685) //数为任意 输入这个数停止建立单链表
{
p = (LNode *)malloc(sizeof(LNode));
p->next = L->next ;
L->next = p;
p->data = x;
scanf("请输入插入的数%d",x);
}
return L;
}
//尾插法建立一个单链表
LinkList List_LowInsert(LinkList L)
{
LNode *p,*r=L; //*r永远指向单链表最后一个节点
r = L;
int x;
scanf("请输入插入的数:%d",x);
while(x!=4613486)
{
p = (LNode*)malloc(sizeof(LNode));
r->next = p; //r为头下一个h指向s就接起来了
r = p; //r指向表尾
p->data = x;
scanf("请输入插入的数:%d",x);
}
r->next = NULL; //建立完成 把r next置空
return L;
}
//表长
int Length(LinkList L)
{
int len = 0;
LNode *p;
p = L;
while(p->next !=NULL)
{
p = p->next ;
len++;
}
return len;
}
int main()
{
int i,e;
LNode a;
LinkList L;
InitList(L);
ListInsert(L,i,e);
InsertNextNode(&a,e);
InesrtPriorNode(&a,e);
ListDelete(L,i,&e);
DeleteNode(&a);
GetElem(L,i);
LocateElem(L,e);
List_HeadInesrt(L);
List_LowInsert(L);
Length(L);
return 0;
}