1. 程式人生 > >資料結構—連結串列的基本操作(c語言程式碼)

資料結構—連結串列的基本操作(c語言程式碼)

連結串列

連結串列也是一種線性表,與順序表不同之處在於不像順序表佔據一段連續的儲存空間,而是將儲存單元分散在記憶體的任意地址上。

連結串列結構中,儲存每個資料時候都會把記錄寫在連結串列的一個結點(node)中,每個結點之間由指標相連,形成如同鏈子的結構。

結點(node):可以是一個結構體型別元素,必須有一個專門來存放地址的域,用這個域來存放後繼結點的地址,這樣就連線起來

連結串列組成:通常有表頭(指標變數,存放第一個結點地址),最後一個結點的指標域要空(NULL,因為沒有後繼結點)


例項分析

/********************************************
 *從終端輸入一組整數,以0為結束標誌,存放連結串列中 
 *列印連結串列的值 
 *再刪除順序表中的第五個元素,打印出結果
 *最後在記憶體中釋放該連結串列 
 ********************************************/ 
#include<stdio.h>
#include<conio.h>
#define MaxSize 10
#include<bits/stdc++.h>



/* 定義一個結構體Sqlist */ 
typedef struct node{
	int data;      		//資料域 
	struct node *next;	//指標域 
}LNode, *LinkList;		
//自定義方式將結構定義為LNode型別  在定義一個指向LNode的指標型別變數 
//LNode *L  等價於 LinkList L 


/* 建立一個連結串列,包含n個結點(長度為n) */
/* 引數L:Sqlist型別的指標	因為是指標所以可以在函式中直接對順序表進行操作 */
LinkList myLinkList(int n){
	LinkList p, r, list = NULL;
	int e, i;
	for(i = 1; i <= n; i++)
	{
		scanf("%d", &e);						//輸入結點的內容
		p = (LinkList) malloc (sizeof(LNode));	//為新建的結點開闢記憶體空間
		p->data = e;							//元素賦值
		p->next = NULL;
		if(!list)
			list = p;							//賦值連結串列頭指標 
		else
			r->next = p; 						//將結點連入連結串列
		r = p; 
	}
	return list;								//返回連結串列頭指標 
	
}

/******************** 
 *向連結串列中插入結點 
 *引數L :Sqlist型別的指標
 *引數i:插入元素的位置
 *引數item:插入的元素
 *********************/
void insertList(LinkList *list, LinkList q, int e)
{
	LinkList p;								
	p = (LinkList) malloc (sizeof(LNode));	//為新建的結點開闢記憶體空間
	p->data = e;							//元素賦值 
	if(! *list){
		*list = p;
		p->next = NULL;
	} 
	else{
		p->next = q->next;
		q->next = p;
	}
} 
 
/******************** 
 *刪除連結串列某結點 
 *引數L :Sqlist型別的指標
 *引數i:刪除元素的位置
 *********************/
void delLink(LinkList *list, LinkList q)
{
	LinkList r;
	if(q == *list)					//如果刪除第一個結點 
	{
		*list = q->next;
		free(q);
	}
	else						//刪除其他結點 
	{
		for(r = *list; r->next != q; r = r->next)
		if(r->next != NULL)
		{
			r->next = q->next;
			free(q);
		}
	}
}
/******************** 
 *銷燬一個連結串列 
 *引數L :Sqlist型別的指標
 *引數i:刪除元素的位置
 *********************/
void destroyLinkList(LinkList *list)
{
	LinkList p, q;
	p = *list;
	while(p)					//迴圈釋放每一個連結串列結點 
	{
		q = p->next;
		free(p);
		p = q;
	}
	*list = NULL;
}
/******************** 
 *測試函式 
 *********************/
int main()
{
	int e, i;
	LinkList l, q;
	q = l = myLinkList(1);		//建立一個連結串列結點,q和l指向該結點 
	scanf("%d" , &e);
	while(e)
	{
		insertList(&l, q, e);
		q = q->next;
		scanf("%d" , &e);
	}
	q = l;
	printf("連結串列內容為:\n");
	while(q)
	{
		printf("%d" , q->data);
		q = q->next;
	}
	q = l;
	printf("刪除第五個結點:\n");
	for(i = 0; i < 4; i++)		//指標q指向連結串列第五個元素
	{
		q = q->next;
	} 
	delLink(&l, q);				//刪除q指向的結點 
	q = l;
	while(q)					//列印刪除後的結果 
	{
		printf("%d" , q->data);
		q = q->next;
	}
	destroyLinkList(&l);		//釋放該連結串列 
	return 0;
}