王道數據結構:單鏈表上基本操作的實現(C語言版)

單鏈表:

線性表的鏈式存儲又稱單鏈表,它是通過一組任意的存儲單元來存儲線性表中的數據元素。爲了建立數據元素之間的線性關係,除存放元素自身的信息外,還需要存放一個指向其後繼的指針。

結構示意圖:

data next

 

 

特點:

這種存儲方式增加刪除元素較爲方便,但不支持隨機存取。

其基本實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct LNode{
	int data;
	struct LNode *next; 
}LNode,*LinkList;
//頭插法建立單鏈表
LinkList List_HeadInsert(LinkList &L){
	//每次均在頭節點之後插入元素 
	LNode *s;//用於新節點的指針 
	int x;
	L =(LNode*)malloc(sizeof(LNode));//創建頭節點 
	L->next=NULL;//初始化爲空

   
	scanf("%d",&x);

	while(x != 9999){
		s=(LNode*)malloc(sizeof(LNode));//創建新節點 
		s->data=x;//將值放進數據域 
		s->next=L->next; //
		L->next=s;//將新節點插入表中,L爲頭指針 
		scanf("%d",&x); 
	
	} 
    
	return L;
	
} 
//尾插法建立單鏈表
LinkList List_TailInsert(LinkList &L){
	//從表頭到表尾正向建立單鏈表,每次均在表尾插入元素
	int x;
	L=(LNode *)malloc(sizeof(LNode)); 
	LNode *s;
	LNode *r=L;//r爲表尾指針 
	scanf("%d",&x);//輸入結點的值 
	
	while(x!=9999){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s; 
	    scanf("%d",&x);//只要輸入不結束,就繼續創建新節點 
	  
	} 
	r->next=NULL;//尾指針置空 
	return L;
	 
} 
//按序號查找節點值
LNode *GetElem(LinkList L,int i){
	//取出帶頭結點單鏈表第i個位置的結點指針
	int j=1;
	LNode *p=L->next;//將指針指向頭節點
	if(i<1)  return NULL;
	if(i==0) return L;
	while(p&&j<i){
		p=p->next;
		j++;
	}
	return p;
	 
} 
//按值查找
void LocateElem(LinkList L,int e){
	LNode *p=L->next;
	int cnt=1;//用於記錄位置 
	while(p!=NULL&&p->data!=e){//當不到最後一個節點並且值沒有查到時,繼續查找 
	  p=p->next;
	  cnt++; 
    }
    
	if(p==NULL){
		printf("不存在該值\n");
	}else{
	    printf("該值的節點位置爲:%d\n",cnt);
	}  
} 
//插入節點操作
void InsertLNode(LinkList &L,int e,int i){
	LNode *s=(LNode*)malloc(sizeof(LNode));//創建新節點 
	s->data=e; 
	LNode *p=GetElem(L,i-1);
	s->next=p->next;//先成鏈 
	p->next=s; // 再斷鏈,防止後面數據丟失 
	
} 
//刪除節點操作
void DeleteNode(LinkList &L,int i){
	LNode *p=GetElem(L,i-1);
	LNode *q=p->next;
	p->next=q->next;
	free(q);
} 
//求表長操作
int GetLength(LinkList L){
	int length=0;
	LNode *p=L;
	while(p->next!=NULL){
	     p=p->next;
	     length++;
    }   
	return length;     
} 
//輸出表
int PrintList(LinkList L){
	LNode *p=L;
	//printf("%d->",p->data);
	while(p->next!=NULL){
		 p=p->next;
		 printf("%d->",p->data);
	}   
	printf("\n");
	return 0;
} 
int main(){
	LinkList l1;
	printf("頭插法建立單鏈表,請輸入數據,輸入9999結束輸入\n");
	List_HeadInsert(l1);//頭插法  
	PrintList(l1);//輸出表
	printf("當前表長爲:%d\n",GetLength(l1));//求表長	
	InsertLNode(l1,9999,3); //插入節點操作 
	PrintList(l1);//輸出表
	printf("當前表長爲:%d\n",GetLength(l1));//求表長
	DeleteNode(l1,3); //刪除節點 
	PrintList(l1);//輸出表
	printf("當前表長爲:%d\n",GetLength(l1));//求表長
	LNode *t=GetElem(l1,3);//按位置查找 
	printf("該位置結點值爲%d\n",t->data);
	LocateElem (l1,2);// 按值查找 
	LocateElem (l1,10);
//	LinkList l2;
//	printf("尾插法建立單鏈表,請輸入數據,輸入9999結束輸入\n");
//	List_TailInsert(l2);
//	PrintList(l2);
    return 0;
} 

運行截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章