#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList List_headinsert(LinkList &L) //头插法建立单链表
{
LNode *s;
int x=0;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入:\n");
scanf("%d",&x);
while(x!=999)
{
s=(LNode *)malloc(sizeof(LNode));
s->next=L->next;
s->data=x;
L->next=s;
printf("请输入:\n");
scanf("%d",&x);
}
return L;
}
LinkList list_endinsert(LinkList &L) //尾插法建立单链表
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入:\n");
scanf("%d",&x);
LNode *p=L;
while(x!=999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
p=s;
printf("请输入:\n");
scanf("%d",&x);
}
return L;
}
void print(LNode *L) //遍历
{
LNode *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
LNode *search(LinkList L,int e) //按值查找结点
{
LNode *p=L->next;
while(p!=NULL)
{
if (p->data==e)
return p;
else
p=p->next;
}
return NULL;
}
LNode *search_hao(LinkList L,int e) //按序号查找结点
{
LNode *p=L->next;
int i=1;
while(p!=NULL)
{
if (i==e)
return p;
else
p=p->next;
i+=1;
}
return NULL;
}
bool INsert(LinkList &L,int e) //在链表第e个位置上插入一个元素
{
int i=1,x,j=0;
LNode *s,*p=L->next,*q=L;
s=(LinkList)malloc(sizeof(LNode));
printf("请输入x:\n");
scanf("%d",&x);
s->data=x;
s->next=NULL;
while(p!=NULL)
{
p=p->next;
q=q->next;
j++;
}
printf("j:%d\n",j);
if (e<1||e>j+1) //注意:若链表有j个节点则要插入的节点可以在j+1的位子上
return false;
else
{
if (e<=j)
{
printf("e<=j\n");
p=L->next;
while(p!=NULL)
{
if (i==e)
{
s->next=p;
q->next=s;
return true;
}
else
{
p=p->next;
q=q->next;
i+=1;
}
}
}
if(e==j+1)
{
p=q;
p->next=s;
return true;
}
}
return false;
}
bool INsert_after(LinkList &L,int e) //插入到节点的后边
{
int i=1,x=0;
LNode *s,*p=L->next;
s=(LinkList)malloc(sizeof(LNode));
printf("请输入x:\n");
scanf("%d",&x);
s->data=x;
s->next=NULL;
while(p!=NULL)
{
if (i==e)
{
s->next=p->next;
p->next=s;
return true;
}
else
{
p=p->next;
i+=1;
}
}
return false;
}
bool deletelist(LinkList &L,int e) //删除值为e的结点
{
/*法一:
LNode *p=L->next,*q=L;
while(p!=NULL)
{
if (p->data==e)
{
q->next=p->next;
free(p);
return true;
}
else
{
q=q->next;
p=p->next;
}
}
return false;
*/
//法二:
LNode *p=L->next;
while(p!=NULL)
{
if (p->data==e)
{
p->data=p->next->data;
p->next=p->next->next;
free(p->next);
return true;
}
else
{
p=p->next;
}
}
return false;
}
int main()
{
LNode *L1,*L2,*p;
L1=List_headinsert(L1);
printf("\n");
printf("=====");
printf("\n");
L2=list_endinsert(L2);
print(L1);
printf("-----------\n");
print(L2);
printf("+++++\n");
p=search(L1,1);
if (p!=NULL)
printf("值为1的结点的值:%d\n",p->data);
else
printf("NULL");
p=search_hao(L2,3);
if (p!=NULL)
printf("序号为3的节点的值:%d\n",p->data);
else
printf("NULL");
if (INsert(L2,4)==true)
printf("插入成功!\n");
else
printf("插入失败!\n");
printf("插入后的链表:\n");
print(L2);
printf("*******\n");
if (INsert(L1,5)==true)
printf("插入成功!\n");
else
printf("插入失败!\n");
printf("插入后的链表:\n");
print(L1);
printf("%%%%%%%%%%%%%%\n");
if(deletelist(L1,2)==true)
{
printf("删除成功!\n");
}
else
printf("删除失败!\n");
printf("删除后的链表:\n");
print(L1);
return 0;
}
注:若链表共有m个节点:在使用前插法插入元素时,节点插入到第m+1个位置是特殊情况应特别考;若使用后插法则无需考虑。
**
明天写双链表的讲解部分-----7/14
**