單連結串列增刪改查(無頭指標)

Jacobshash發表於2020-11-02
#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));   //動態建立一個node節點空間 
		if(s==NULL){
			return false;
		} 
		s->data=x;    //將e賦值給s的data節點 
		s->next=L;    //將L的地址賦值給s->next節點 
		L=s;          //將s地址賦值給L; 
		return true;
	}
	LNode *p;    //定義一個指向當前掃描到的節點 
	int j=1;     //當前p指向的是第幾個節點 
	p = L;       //p指向第一個節點(主義:不是頭節點)
	while(p!=NULL && j<i-1){     // 迴圈到指定位置或者到尾節點時跳出迴圈, 
		p=p->next;               //將p->next賦值給p 
		j++;                     //加一操作 
	} 
	
	if(p==NULL){   //p==NULL,說明插入的位置的 i 的值過大了,超出了邊表長度 
		return false;
	} 
	
    LNode *s=(LNode *)malloc(sizeof(LNode)); //動態建立一個node節點空間 
    if(s==NULL){					//記憶體分配失敗 
    	return false;
	}
    s->data =x;              //將e賦值給s的data節點 
    s->next = p->next;       //將p->next的地址賦值給s->next節點
    p->next = s;             //將s地址賦值給p->next
    
    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;
}

//指定元素的後插操作(節點p,要插入的元素x) 
bool InsertNextNode(LNode *p,int x){
	
	if(p==NULL){   //p==NULL,說明插入的位p為空 
		return false;
	} 
	
    LNode *s=(LNode *)malloc(sizeof(LNode)); //動態建立一個node節點空間 
    if(s==NULL){        //記憶體分配失敗 
    	return false;
	}
    s->data =x;              //將e賦值給s的data節點 
    s->next = p->next;       //將p->next的地址賦值給s->next節點
    p->next = s;             //將s地址賦值給p->next
    
    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;//將temp指標重新指向頭結點
    //只要temp指標指向的結點的next不是Null,就執行輸出語句。
    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;
} 

相關文章