#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}*LinkList,LNode;
bool InitList(LinkList &L){
L=NULL;
return true;
}
bool isEmpty(LinkList L){
return (L==NULL);
}
bool ListInsert(LinkList &L,int i,int x){
if(i<1){
return false;
}
if(i==1){
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->data=x;
s->next=L;
L=s;
return true;
}
LNode *p;
int j=1;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->data =x;
s->next = p->next;
p->next = s;
return true;
}
bool InsertPriorNode_HaveHeadNode(LinkList L,LNode *p,int x){
if(p==NULL){
return false;
}
LNode *s =(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
LNode *k =(LNode *)malloc(sizeof(LNode));
k=L;
while(k->next==p){
k=k->next;
}
s->data=x;
s->next=p;
k->next=s;
return true;
}
bool InsertPriorNode_NoneHeadNode(LNode *p,int x){
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=x;
return true;
}
bool InsertNextNode(LNode *p,int x){
if(p==NULL){
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->data =x;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList &L,int i,int &e){
int w=i-1;
if(w<1){
return false;
}
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<w-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
if(p->next==NULL){
return false;
}
LNode *q = p->next;
e= q->data;
p->next=q->next;
free(q);
return true;
}
LNode *GetElemByIndex(LinkList L,int i){
if(i<1){
return NULL;
}
LNode *p;
int j=1;
p=L;
while(p!=NULL && j<i){
p=p->next;
j++;
}
return p;
}
void GetElemByValue(LinkList L,int x){
if(isEmpty(L)){
return ;
}
LNode *p;
p=L;
int i=1;
for(p=L;p!=NULL;p=p->next){
if(p->data==x){
printf("第%d上的元素為%d\n",i,p->data);
}
i++;
}
}
int Length(LinkList L){
if(isEmpty(L)){
return 0;
}
int len = 1;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
void Display(LinkList L){
int i=1;
if(isEmpty(L)){
return ;
}
LinkList p=L;
while (p) {
printf("第%d元素為%d \n",i,p->data);
p=p->next;
i++;
}
printf("\n");
}
int main(){
LinkList L;
InitList(L);
for(int i=1;i<=10;i++){
ListInsert(L,i,i);
}
Display(L);
LNode *p=GetElemByIndex(L,3);
printf("第3位上的元素為%d\n",p->data);
InsertPriorNode_NoneHeadNode(p,13);
Display(L);
InsertPriorNode_HaveHeadNode(L,p,14);
Display(L);
InsertNextNode(p,12);
Display(L);
int length_front = Length(L);
printf("當前連結串列的長度為%d\n",length_front);
printf("\n\n");
int e=-1;
ListDelete(L,3,e);
Display(L);
printf("被刪除的元素為%d\n",e);
printf("\n\n");
GetElemByValue(L,3);
printf("\n\n");
int length_back = Length(L);
printf("當前連結串列的長度為%d\n",length_back);
return 0;
}