C語言 單鏈表表示與操作實現

創建一個靜態鏈表
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
	int data;	//數據域
	Node* next;	//指針域
}node;
int main()
{
	Node Node1 = { 1,NULL };
	Node Node2 = { 2,NULL };
	Node Node3 = { 3,NULL };
	Node1.next = &Node2;
	Node2.next = &Node3;
	return 0;
}
創建一個動態鏈表
頭文件
  1. stdio.h
  2. stdlib.h
別名定義
typedef int ElemType;
抽象數據類型鏈定義
typedef struct LNode {
	ElemType data;
	struct LNode* next;//指向下一個節點
}LNode,*LinkList;
頭插法初始化單鏈表(帶頭結點)
LinkList CreateList_head(LinkList& L)//頭插法
{
	L = (LinkList)malloc(sizeof(LNode));//帶頭結點的鏈表
	L->next = NULL;
	LNode* s; int x;
	scanf("%d", &x);
	while (x != 9999) //輸入9999跳出循環,頭插法結束
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;//第一次L->next==NULL,此後L->next爲上一次新建s節點
		L->next = s;
		scanf("%d", &x);
	}
	return L;
}
尾插法初始化單鏈表(帶頭結點)
LinkList CreateList_tail(LinkList& L)//尾插法
{
	int x;
	L = (LinkList)malloc(sizeof(LNode));//帶頭結點的鏈表
	LNode* s;
	LNode* r = L;
	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = NULL;
		r->next = s;
		r = s;
		scanf("%d", &x);
	}
	return L;
}
返回鏈表長度
int Length_LinkList(LinkList L) //返回鏈表長度
{
	int x = 0;
	while (L->next != NULL)
	{
		x++;
		L = L->next;
	}
	return x;
}
按位查找元素
LNode* GetElem(LinkList L, int i)
{
	int len = Length_LinkList(L); //鏈表長度
	if (i<1 || i>len)
	{
		printf("鏈表無此區域!");
	}
	else {
		for (int n = 1; n <= i; n++)
		{
			L = L->next;
		}
	}
	return L;
}
按值查找元素
LNode* LocateElem(LinkList &L, ElemType e) //按值查找
{
	LNode* p = L->next;
	while (p != NULL && p->data != e)
		p = p->next;
	return p;
}
頭插法插入元素
bool ListFrontInsert(LinkList &L, int i, ElemType e)
{
	LinkList p = GetElem(L, i - 1);
	if (p == NULL)
	{
		return false;
	}
	LinkList s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}
刪除節點
bool ListDelete(LinkList &L, int i)
{
	LinkList p = GetElem(L, i - 1);
	if (p == NULL)
	{
		return false;
	}
	else
	{
		LinkList q;
		q = p->next;
		p->next = q->next;
		free(q);
		return true;
	}
}
打印鏈表
void PrintList(LinkList L) //打印鏈表中每個節點的值
{
	L = L->next;
	printf("鏈表節點按次序打印爲:");
	while (L != NULL)
	{
		printf("%d ", L->data);
		L = L->next;
	}
	printf("\n");
}

測試代碼
int main()
{
	LinkList L;
	CreateList_tail(L);
	PrintList(L);
	printf("鏈表長度爲:%d\n", Length_LinkList(L));
	printf("第二個節點的數據域爲:%d\n", GetElem(L, 2)->data);
	ListFrontInsert(L, 2, 99);
	PrintList(L);
	ListDelete(L,4);
	PrintList(L);
	return 0;
}

在這裏插入圖片描述

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