詳解C語言之單鏈表

一、思路步驟

1. 定義結構體

a.數據域:用來存放數據

b.指針域:用來存放下一個數據的位置

2.初始化

申請頭結點,並將其初始化為空

3.求當前數據元素的個數

在這裡插入圖片描述

a.設置一個指針變量p指向頭結點和計數變量size等於0

b.循環判斷p->next是否為空,如果不為空,就讓指針p指向它的直接後繼結點,並讓size自增

c.返回size

4.插入

插入

a.設置兩個指針,一個指向頭結點,另一個要動態申請內存空間存放要插入的數
b.找到要插入位置的前一位,並判斷插入位置是否正確
c.生成新結點,給新結點數據域賦值,執行步驟①,在執行步驟②

5.刪除

刪除

a.設置兩個指針p、q,p指向頭結點,q指向要被刪除的結點

b.找到要刪除位置的前一位,並判斷刪除位置是否正確、存在

c.q指向被刪除的結點,將被刪除結點的數據域賦值給x,p指向被刪除結點的下一個結點,釋放q的內存空間

6.釋放內存空間

最後記得將頭結點置空哦!要不然容易出現野指針。

二、代碼

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;//給int起個別名,方便以後修改
typedef struct Node
{
	DataType data;//數據域
	struct Node *next;//指針域
}SLNode;
//初始化
void ListInit(SLNode **head)
{
	*head = (SLNode *)malloc(sizeof(SLNode));//申請頭結點
	(*head)->next = NULL;
}
//求當前數據元素個數
int ListLength(SLNode *head)
{
	SLNode *p = head;
	int size = 0;
	while (p->next != NULL)
	{
		p = p->next;
		size++;
	}
	return size;
}
//插入
int ListInsert(SLNode *head, int i, DataType x)
{
	SLNode *p, *q;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("插入參數位置錯誤!!!\n");
		return 0;
	}
	q = (SLNode *)malloc(sizeof(SLNode));//生成新結點
	q->data = x;
	q->next = p->next;
	p->next = q;
	return 1;
}
//刪除
int ListDelete(SLNode *head, int i, DataType *x)
{
	SLNode *p, *q;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && p->next->next != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("刪除位置參數錯誤!!!\n");
		return 0;
	}
	q = p->next;
	*x = q->data;
	p->next = p->next->next;
	free(q);//釋放被刪除結點的內存空間
	return 1;
}
//按位取
int ListGet(SLNode *head, int i, DataType *x)
{
	SLNode *p;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	if (j != i)
	{
		printf("取出位置參數錯誤!!!\n");
		return 0;
	}
	*x = p->data;
	return 1;
}
//釋放
void ListDestroy(SLNode **head)
{
	SLNode *p, *q;
	p = *head;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*head = NULL;
}

int main()
{
	SLNode *head;
	int i, x;
	ListInit(&head);
	for (i = 0; i < 10; i++)
		ListInsert(head, i, i + 10);
	ListDelete(head, 9, &x);
	for (i = 0; i < ListLength(head); i++)
	{
		ListGet(head, i, &x);
		printf("%d ", x);
	}
	ListDestroy(&head);
	system("pause");
	return 0;
}

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: