數據結構與算法(3)--鏈表

1.鏈表的基礎知識

首節點:
            第一個有效節點
尾節點:
            最後一個有效節點
頭節點:
            頭節點的數據類型和首節點類型一樣
            是第一個有效節點之前的那個節點
    頭節點並不存放有效數據
    加頭節點的目的主要是爲了方便對鏈表的操作

頭指針:
  指向頭節點的指針變量
  尾指針:
  指向尾節點的指針變量
  如果希望通過一個函數來對鏈表進行處理,我們只需要一個參數:頭指針

泛型:不同的存儲方式,執行的操作是一樣的


2.鏈表的增刪改查

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
	int data;     //數據域
	struct Node * pNext;    	//指針域
}NODE , * PNODE;//NODE 等價於struct Node  PNODE等價於struct Node *

	PNODE create_list(void);
	void traverse_list(PNODE pHead);
	bool is_empty(PNODE pHead);
	int length_list(PNODE);//可以省略參數名
	bool insert_list(PNODE,int ,int );//插入,參數:那個鏈表,插入位置,插入的值
	bool delete_list(PNODE,int ,int *);
	void sort_list(PNODE);


int main()
{
	int length;
	int val;

	PNODE create_list(void);
	PNODE pHead=NULL; //等價於 struct Node * pHead =NULL

	pHead=create_list();//create_list()功能:創建一個非循環單鏈表,並將該鏈表的頭節點的地址賦給pHead
	traverse_list(pHead); //遍歷
	is_empty(pHead);
    length=length_list(pHead);
	printf("鏈表長度=%d\n",length);
	printf("排序:");
	sort_list(pHead);
	traverse_list(pHead);
	insert_list(pHead,3,99 );
	traverse_list(pHead);
if(delete_list(pHead,5,&val)==true)
{
	printf("刪除成功   刪除的數:%d ",val);
}
else
{
    printf(" 刪除失敗");
}
	printf("\n");
	traverse_list(pHead);

    return 0;
}
PNODE create_list(void)  //返回一個地址
{
	int len;
	int i;
	int val; //用來臨時存放用戶輸入的節點的

    PNODE pHead=(PNODE)malloc(sizeof(NODE));//分配了一個不存放有效數據的頭節點
if(NULL==pHead)
{
	printf("分配失敗,程序終止\n");
	exit(-1);
}
	PNODE pTail=pHead; //定義一個pTail,使他永遠指向爲節點
	pTail->pNext=NULL;        //這裏只有一個頭節點,相當於pTail也指向了尾節點
	printf("請輸入您需要生產的鏈表節點的個數:len=");
	scanf("%d",&len);
for(i=0;i<len;++i)
{
	printf("請輸入第%d個節點的值:",i+1);
	scanf("%d",&val);
	PNODE pNew=(PNODE)malloc(sizeof(NODE));  
if(NULL==pHead)
{
	printf("分配失敗,程序終止\n");
	exit(-1);
}
	pNew ->data =val;   //每循環一次,生成一個新的節點,每次都把新的節點掛到pTail後面
	pTail->pNext=pNew;
	pNew->pNext=NULL;
	pTail=pNew;
}       

    return pHead;

}

void traverse_list(PNODE pHead)
{
	PNODE p=pHead->pNext;
	while(NULL!=p)      //當p指向尾節點時,p爲空
{   
	printf("%d   ",p->data);   
	p=p->pNext;
}
    printf("\n");
}

bool is_empty(PNODE pHead)
{
if(pHead->pNext==NULL)
{
	printf("鏈表爲空");
	return true;
}
else
{
    return 	false;
}


}

int length_list(PNODE pHead)
{
	int len=0;
	while(pHead->pNext!=NULL)
{
	len++;
	pHead=pHead->pNext;
}
    return len;
}

void sort_list(PNODE pHead)
{
	int i,j,t;
	PNODE p,q;
for(i=0,p=pHead->pNext;i<length_list( pHead)-1;++i,p=p->pNext)
{
   for(j=i+1,q=p->pNext;j<length_list(pHead);++j,q=q->pNext)
   {
		if(p->data > q->data)
		{
        t=p->data;
		p->data=q->data;
		q->data=t;
		}
	}
}
return ;
}

bool insert_list(PNODE pHead,int pos ,int val )
{
	int i=0;
	PNODE p=pHead;
while(p!=NULL && i<pos-1)
{
	p=p->pNext;
	i++;
}
if(i>pos || p==NULL){
    return false;
}
	PNODE pNew=(PNODE) malloc(sizeof(NODE));
	pNew->data=val;
	PNODE q=p->pNext;  //上面程序已對鏈表進行循環,將p定位到插入位置
	p->pNext=pNew;
	pNew->pNext=q;

	return true;
}

bool delete_list(PNODE pHead,int pos,int * val)     //利用指針在函數中更改全局變量val的值
{
	int i=0;
	PNODE p=pHead;
while(p!=NULL && i<pos-1)
{
	p=p->pNext;
	i++;
}
if(i>pos || p==NULL)
{
    return false;
}
	*val=p->pNext->data;   //將刪除的數據存入指針val所指向的地址中
	p->pNext=p->pNext->pNext; //刪除節點p->pNext

	return true;

}




發佈了34 篇原創文章 · 獲贊 68 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章