1. 程式人生 > >演算法的樂趣c/c++ —— 2.1連結串列的實現

演算法的樂趣c/c++ —— 2.1連結串列的實現

宣告:參考書籍《演算法筆記》 作者:作者: 胡凡 / 曾磊  出版社: 機械工業出版社   ISBN: 9787111540090

單向連結串列的實現

首先我們需要建立一個 struct 結構體,結構體裡面建立兩個變數,一個變數用於存放資料,另外一個用於存放地址(存放的是下一個節點的地址)。然後利用這個struct建立單向連結串列。

#include<stdio.h>
#include<stdlib.h>
struct node{
	int data;
	node* next;
};

node* create(int Array[], int n)
{
	node *p, *head, *pre;     //建立head用於存放首地址,p用於建立新的地址,pre用於存放下一個下一個節點的中間變數 
	head = new node;
	head->next = NULL;        //head的下一個地址暫時為NULL 
	pre = head;               //將head賦值給 pre 
	for(int i=0; i<n; i++)    //迴圈建立n個節點 
	{
		p = new node;         //p為新的節點 
		p->data = Array[i];   //建立p的同時給p賦值 
		p->next = NULL;       //因為p的下一個節點還未建立,所以p->next =NULL 
		pre->next = p;        //pre為上一個節點,將上一個節點的 ->next設定為p 
		pre = p;              //將p賦值給pre用於建立下一個節點時賦值地址 
	}
	return head;              //返回頭結點 
}
//查詢函式 
int search(node* head, int x)  //查詢到 x 的數量 
{
	int count = 0;             //用於存放x的數量 
	node *p = head->next;      //p是指標,指向的是第二個節點地址,因為head只存放地址,所以head不可能是x 
	while(p != NULL)     //只要沒到最後一個節點就一直迴圈 
	{
		if(p->data == x) count++; 
		p = p->next;          //p指向下一個地址 
	}
	return count;
}
//插入函式
void insert(node* head,int pos, int x)     //在給定的位置插入資料 
{
	node *p = head;                        //p為節點 
	for(int i=0; i<pos-1; i++) p = p->next;      //將p定位到pos的位置處 
	node* q = new node;                    //q為新的節點 
	q->data = x;                           //q得值為x 。q的下一個地址為p的下一個地址 。p的下一個地址為q 
	q->next = p->next;
	p->next = q; 
}
//刪除函式 
void del(node *head, int x)     //刪除所有的x 
{
	node *p = head->next;       //p為下一個節點 
	node *pre = head;           //pre儲存上一個節點 
	while(p != NULL)
	{
		if(p->data == x)         //達到尋找的條件 
		{
			pre->next = p->next;   //p上一個節點儲存的地址變為p儲存的地址 
			delete(p);             //刪除p 
			p = pre->next;         //p變成pre的下一個節點 
		}
		else                       //將p跟pre後移一位 
		{
			pre = p;           
			p = p->next;
		}	
	}
}