/*单链表*/
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
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 head_InsertList(LinkList &L) //头插法建立单链表
{
ElemType e;
printf("please input some number:");
scanf("%d",&e);
while(e!=-1)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
LNode *p=L;
s->next=p->next;
p->next=s;
scanf("%d",&e);
}
return L;
}
LinkList tail_InsertList(LinkList &L) //尾插法建立单链表
{
ElemType e;
LNode *p=L;
printf("please input some number:");
scanf("%d",&e);
while(e!=-1)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
p->next=s;
p=s; //p始终指向尾部
scanf("%d",&e);
}
p->next=NULL;
return L;
}
bool InsertList(LinkList &L,ElemType i,ElemType e) //插入节点操作
{
if(i<1)
return false;
LNode *p=L;
int j=0; //当前p指针位置
while(p!=NULL && j<i-1) //找到位置是第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 DeleteList(LinkList &L,ElemType i) //删除节点操作
{
if(i<1)
return false;
LNode *p=L,*q=L->next;
int j=0;
while(q!=NULL && j<i-1)
{
p=q;
q=q->next;
j++;
}
if(q==NULL)
return false;
p->next=q->next;
free(q);
}
LNode * getElem1(LinkList L,ElemType i) //按位查找节点
{
if(i<0)
return NULL;
int j=0;
LNode *p=L;
while(j<i && p!=NULL)
{
p=p->next;
j++;
}
return p;
}
LNode * getElem2(LinkList L,ElemType e) //按值查找节点
{
if(L==NULL)
return NULL;
LNode *p=L->next;
while(p!=NULL && p->data!=e)
p=p->next;
return p;
}
void Print(LinkList L) //输出单链表
{
LNode *p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
void main()
{
LinkList L;
InitList(L);
head_InsertList(L);
Print(L);
printf("************\n");
DeleteList(L,2);
Print(L);
printf("************\n");
InsertList(L,2,100);
Print(L);
printf("************\n");
printf("%d\n",getElem1(L,3)->data);
printf("************\n");
printf("%d\n",getElem2(L,100)->data);
printf("************\n");
}