#include<stdio.h>
#include<stdlib.h>
//不带头节点的链表基本操作
typedef struct Lnode{
int data;
Lnode *next;
}Lnode,*LinkList;
//初始化
void InitList(LinkList &l){
l = NULL;
}
//求表长
int Length(LinkList &l){
if(l->data==NULL) return 0;
int len = 0;
Lnode *p = l;
while(p->data!=NULL){
len++;
p = p->next;
}
return len;
}
//按位序插入
bool InsertIndex(LinkList &l,int index,int e){
if(index<1)return false;
if(index==1){
Lnode *s = (Lnode*) malloc(sizeof(Lnode));
s->data=e;
s->next=l;
l=s;
return true;
}
Lnode *p = l;
int j = 1;
while(p!=NULL&&j<index-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 InsertFront(LinkList &l,Lnode *p,int x){
if(l==NULL) return false;
Lnode *s = (Lnode *) malloc(sizeof(Lnode));
s->data = x;
s->next = p->next;
p->next = s;
int temvalue = p->data;
p->data = s->data;
s->data = temvalue;
return true;
}
//按序号查找节点
Lnode *GetElem(LinkList l,int index){
if(index<1)return NULL;
int j = 1;
Lnode *p = l;
while(p!=NULL&&j<index){
p=p->next;
j++;
}
if(p==NULL)return NULL;
return p;
}
//按值查找节点
Lnode *LocateElem(LinkList l,int e){
if(l==NULL) return NULL;
Lnode *p = l;
while (p!=NULL&&p->data!=e){
p=p->next;
}
if(p==NULL)return NULL;
return p;
}
//按位序进行删除
bool DeleteIndex(LinkList &l,int index,int e){
if(index<1)return false;
if(index==1){
free(l);
return true;
}
int j = 1;
Lnode *p = l;
while(p!=NULL&&j<index-1){
p=p->next;
j++;
}
Lnode *q = (Lnode*)malloc(sizeof(Lnode));
q=p->next;
p->next=q->next;
free(q);
return true;
}
//安指针值进行删除
bool DeleteFront(LinkList &l,Lnode *p){
Lnode *q = (Lnode*) malloc(sizeof(Lnode));
q = l;
while(q!=NULL&&q->data!=p->data){
q=q->next;
}
if(q==NULL)return false;
p = q->next;
q->data =p->data;
q->next = p->next;
free(p);
return false;
}
//头插法建立新链表
LinkList HeadCreate(LinkList &l){
l=NULL;
int x;
scanf("%d",&x);
while(x!=9999){
Lnode *s = (Lnode*) malloc(sizeof (Lnode));
s->data = x;
s->next=l;
l = s;
scanf("%d",&x);
}
return l;
}
//尾插法建立新链表
LinkList CreateTail(LinkList &l){
int x,j=1;//j为了区分首节点和其他节点
scanf("%d",&x);
l = (Lnode*)malloc(sizeof(Lnode));
Lnode *s,*t=l;
while(x!=9999){
if(j==1){
l->data=x;
j++;
}else if(j!=1) {
s = (Lnode *) malloc(sizeof(Lnode));
s->data = x;
t->next = s;
t = s;
j++;
}
scanf("%d",&x);
}
t->next=NULL;
return l;
}
void Print(LinkList l){
Lnode *p=l;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkList l = NULL;
printf("------TailInseart-----------\n");
CreateTail(l);
Print(l);
printf("---------HeadInseart--------\n");
HeadCreate(l);
Print(l);
printf("--------OtherMethod----------\n");
InsertFront(l, GetElem(l,2),5);//插在二号节点的前面
Print(l);
InsertIndex(l,2,10);//插在二号节点
Print(l);
DeleteIndex(l,2,NULL);//删除二号节点上的数
Print(l);
DeleteFront(l, LocateElem(l,2));//删除值为2的节点
Print(l);
return 0;
}