/*单链表*/
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode * next;
}LNode,*LinkList;
bool InitList(LinkList &L); //初始化单链表
LinkList List_TailInsert(LinkList &L);//尾插法设置元素
LinkList List_HeadInsert(LinkList &L); //头插法设置元素
bool ListInsert(LinkList &L,int i,int e);//按位序插入元素,在第i个结点前插入 ,即在第i-1个结点后插入
bool ListDelete(LinkList &L,int i,int e);//按位序删除(带头结点)
bool DeleteNode(LinkList &L,LNode *p,int i);//删除指定节点p
int GetElem(LinkList L,int i);//按位查找,返回第i个元素(带头结点)
int LocateElem(LinkList L,int e);//按值查找,找到数据域为e的结点
void PrintList(LinkList L); //输出单链表内容
bool InitList(LinkList &L) //初始化单链表(带头结点)
{
L=(LNode*)malloc(sizeof(LNode));//定义一个头结点,头指针指向这个头结点
if(L==NULL)
{
return false;
}
L->next=NULL;
return true;
}
/*尾插法建立单链表*/
LinkList List_TailInsert(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode)); //L指向这个链表
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
/*头插法建立单链表*/
LinkList List_HeadInsert(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
LNode *s;
int x;
L->next=NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
bool ListInsert(LinkList &L,int i,int e)
{
if(i<1) //i不合法的情况
{
return false;
}
LNode *p=L;//先找到第i-1个元素,用p指向第i-1个元素
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;
}
/*输出单链表内容*/
void PrintList(LinkList L)
{
LNode *p=L;
while(p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
return;
}
/*按位查找*/
int GetElem(LinkList L,int i)
{
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p->data;
}
/*按值查找,带头结点*/
int LocateElem(LinkList L,int e)
{
int i=1;
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++ ;
}
return i;
}
bool ListDelete(LinkList &L,int i,int e)
{
if(i<1)
{
return false;
}
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
{
return false;
}
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
/*输出单链表带头结点*/
//void PrintList(LinkList L) //此处代码错误,不能 让头结点移动
//{
// LNode *p;
// p=L->next;
// while(p)
// {
// printf("%d ",p->data);
// p=p->next;
// }
// printf("\n");
//}
int main(void)
{
LinkList L;
InitList(L);
List_TailInsert(L);
PrintList(L);
ListInsert(L,3,3);
PrintList(L);
ListDelete(L,3,3);
PrintList(L);
printf("位序为4的结点的数据域为:%d\n",GetElem(L,4));
printf("值为2的结点的位序为:%d",LocateElem(L,2));
return 0;
}