1. 程式人生 > >嚴蔚敏版資料結構——單鏈表

嚴蔚敏版資料結構——單鏈表

嚴蔚敏版資料結構——單鏈表的操作

      記得前上個禮拜,我寫過的一個版本的單鏈表的建立。今天寫下了這個嚴蔚敏版的單鏈表。梳理了一下思路,其基本演算法還是一樣的,還是那句話,理解,理解,理解最重要。這個版本的單鏈表我要提醒自己的是:1、這是直接在函式中採用引用LinkList &   (注意這是引用,不是取指標地址) 對地址進行操作;上個版本是函式返回一個指向結構體指標的指標這種方法;(我還要說明一點:如果這兩種方法都不採用,那就要用指向指標的指標,雙重指標來操作,當然這是很複雜哦,因為我們的連結串列說到底就是一個指標,一般我們採用以上兩種方法即可)2、記住一點,不改變連結串列引數傳值就行,即連結串列就行(LinkList head),要操作連結串列最簡單一種做法就是用引用的方法傳地址,這不是——指向結構體LNode的指標的地址,而是引用、引用、引用。詳情參考下一篇部落格 int & 到底是個啥(LInkList  &        head)。

還是那句話,程式碼是最精簡的解釋,上程式碼欣賞。

程式碼親測完美執行:

/*
   item是暫時用來遍歷元素的指標
    pnew是新建立的結點指標
    pend是連結串列的尾結點
*/

#include<stdio.h> 
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef struct LNode
{
	int data;
	struct LNode *next;
	
}LNode,*LinkList;

//---------------前插法建立單鏈表;---------------- 
void CreatList_H(LinkList &head,int n)
{
	int i;LinkList pnew;
	//先建立頭結點,資料為空;
	head=(LinkList)malloc(sizeof(LNode)); 
	head->next=NULL;
	for(i=0;i<n;i++)
	{
		pnew=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&pnew->data);
		pnew->next=head->next;
		head->next=pnew;
	}
	
}

//--------------後插法建立單鏈表 ------------------
void CreateList_E (LinkList &head,int n)
{
	int i;
	LinkList pnew;
	LinkList pend;//定義最後的節點指標; 
	//先建立頭結點,資料為空;
	head=(LinkList)malloc(sizeof(LNode)); 
	head->next=NULL;
	pend=head;//頭結點是最後的節點 ;
	for(i=0;i<n;i++)
	{
		pnew=(LinkList)malloc(sizeof(LNode));
		printf("請輸入第%d個節點的資料:\n");
		scanf("%d",&pnew->data);
		pnew->next=NULL;
		pend->next=pnew;
		pend=pnew; 
		
	} 	
}

//-------------單鏈表的取值--------------
int  GetElem(LinkList head,int i,LNode &elem ) 
{
	int j=1;
	LinkList item;
	item=head->next;
	while(item&&j<i)
	{
		item=item->next;
		j++;
	}
	if(item==NULL||j>i)// 
	{
		return ERROR;
	}
	elem.data=item->data;
	return OK;
	
}

//-----------------單鏈表的查詢------------------
LinkList LocateElem(LinkList head,LNode elem)
{
	LinkList item;
	item=head->next;
	while(item!=NULL&&item->data!=elem.data)
	{
		item=item->next;
	}
	
	return item;
} 

//------------------插入元素---------------
int  ListInsert (LinkList &head,int i,LNode elem)
{
	LinkList item,pnew;
	int j=0;
	item=head;
	while(item&&(j<i-1))//查詢第i-1個結點,item指向它 
	{
		item=item->next;
		++j;
	}
	if(!item||j>i+1)
	return ERROR;
	
	pnew=(LinkList)malloc(sizeof(LNode));
	pnew->data=elem.data;
	pnew->next=item->next;
	item->next=pnew;
	return OK;	 
} 
//------------------列印連結串列---------------- 
void PrintList(LinkList head)
{
	LinkList item;
	item=head;
	item=item->next;//這一步不是必須要做的,為了跳過頭結點(沒有資料) 
	while(item!=NULL)
	{
		printf("----%d----\n",item->data);
		item=item->next;
	
	}
}
//--------------刪除元素 ------------------- 
	int DeleteElem(LinkList &head,int i)
	{
		LinkList item,del;
		int j=0;
		item=head;
		while((item->next)&&(j<i-1))
		{
			item=item->next;
			++j;
		}
		if(!(item->next)||(j>i-1))
		return ERROR;
		del=item->next;
		//item->next=item->next->next;
		item->next=del->next; 
		delete del;
		return OK;
	} 
int main()
{
	LinkList L;
	LNode e1,e2;//用來測試的
	int n;
    int e2_data;
//-------------建立列表測試------------ 
	printf("輸入要建立的連結串列結點個數:\n");
	scanf("%d",&n);
	printf("輸入%d個數據:\n",n);
	CreatList_H(L,n);
    printf("\n打印出來看看!\n"); 
	PrintList(L);
//-----------取值測試 ----------------- 
	printf("輸入要取值的位置:\n");
	scanf("%d",&n);
	GetElem(L,n,e1);
	printf("\n--該位置上取出的的資料是-%d--\n",e1.data);
////------------查詢測試------------ ---- 
	printf("請輸入要查詢的元素的值e2:\n");
	scanf("%d",&e2.data);
	e2_data=LocateElem(L,e2)->data; 
	printf("e2該元素上的資料是%d\n",e2_data); 
//-------------刪除測試---------------
	printf("請輸入要刪除元素的位置:\n");
	scanf("%d",&n); 
	DeleteElem(L,n);
	printf("\n刪除後的連結串列如下:\n");
	PrintList(L);
//-----------插入測試----------------
	printf("輸入要插入的位置:\n");
	scanf("%d",&n);
	ListInsert(L,n,e2); 
	printf("\n插入後的連結串列如下:\n");
	PrintList(L);
	return 0;
}

測試

       連結串列到此完結!

       博主水平不高,如有失誤處懇望指出