有頭的單鏈表的基本操作

對於單鏈表的基本操作有  初始化,銷燬,以及頭部插入,尾部插入,頭部刪除,尾部刪除以及計算單鏈表的長度。

我這裏的初始化函數,因爲有一個鏈表頭,所以malloc的時候,是從第二個空間進行空間開闢的。並且在釋放的時候,也是從第二個空間開始釋放的。並且頭部的插入和刪除,也都是第二個位置的刪除與插入,如果需要修改頭的值,就需要調用另外一個函數。這個我會在別的博客裏面寫清楚。

具體實現並不難,咋們直接看代碼,有的關鍵點我會在代碼裏備註出來(如果沒有就不備註了,不難理解)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct List
{
	int date;
	struct List * next;

}List;
void init_list(List *ls)
{
	List *tmp = ls;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ls->date = i;
		ls->next = (List*)malloc(sizeof(List));
		ls = ls->next;
	}
	ls->date = i;
	ls->next = NULL;
}

void push_front(List *ls,int date)
{
	List * tmp = (List *)malloc(sizeof(List));
	tmp->date = date;
	tmp->next = ls->next;
	ls->next = tmp;
}
void pop_front(List *ls)
{
	List *tmp = ls->next;

	ls->next = ls->next->next;
	free(tmp);
}
void push_back(List *ls, int date)
{
	while (ls->next)
	{
		ls = ls->next;
	}
	ls->next = (List *)malloc(sizeof(List));
	ls->next->date = date;
	ls->next->next = NULL;
}
void pop_back(List *ls)
{
	while (ls->next->next)
	{
		ls = ls->next;
	}
	free(ls->next);
	ls->next = NULL;
	
}
void print_list(List *ls)
{
	int i = 0;
	for ( i = 0; ls->next; i++)
	{
		printf("%d\n", ls->date);
		ls = ls->next;
	}
	putchar('\n');
	printf("%d\n", ls->date);
}
void free_list(List *ls)
{
	List *tmp;
	ls = ls->next;
	for (int i = 0; ls->next;i++)
	{
		tmp = ls->next;
		free(ls);
		ls = tmp;
	}
	free(ls);

}
int length(List *ls)
{
	int num = 1;
	while (ls->next)
	{
		num++;
		ls = ls->next;
	}
	return num;
}
int main()//這個是測試代碼,裏面的一些東西都是爲了測試整個代碼的正確性的,可以自己寫這個
{
	List ls;
	int i = 13;
	init_list(&ls);
	printf("%d\n", length(&ls));
	push_front(&ls, i);
	printf("%d\n", length(&ls));
	pop_front(&ls);
	push_back(&ls, 20);
	printf("%d\n", length(&ls));
	pop_back(&ls);
	print_list(&ls);
	free_list(&ls);


	return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章