C语言实现单链表(带头结点的)

在用结构体写单链表时,需要先了解指针

#include<stdio.h>
#include<stdlib.h> 
struct Node
{	
	int data;	
	struct Node *next;
}; 
//1.创建一个表头,表示整个链表
struct Node* createlistHead()
{	
	//链表的基本单元是结构体
	//动态申请内存,将结构体指针转变为结构体变量	
	struct Node* listHead = (struct Node*)malloc(sizeof(struct Node));	
	//初始化结构体变量	
	//表头不装数据	
	listHead->next = NULL;	
	return listHead;
}
//2.创建节点;为插入做准备
struct Node* createNewNode(int data)
{	
	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));	
	NewNode->data = data;	
	NewNode->next = NULL;	
	return NewNode;
}
//3.打印链表;创建一个移动指针依此打印链表中的元素
void print(struct Node*listHead)
{	//由于表头没有数据,即从表头的下一个节点开始打印	
	struct Node* pMove = listHead->next;	
	while (pMove) //如果pMove不空	
	{		
		printf("%d\t", pMove->data);		
		pMove = pMove->next;	
	}	
	printf("\n");
}
//4.链表的插入;表头插入
void insertNewNodebyhead(struct Node* listhead, int data)
{	
	struct Node* NewNode = createNewNode(data);
	//调用创建节点的函数	
	NewNode->next = listhead->next;	
	listhead->next = NewNode;
}
//5.标尾插入
void insertNewNodebytail(struct Node* listhead, int data)
{	
	//第一步,创建节点	
	struct Node* newNode = createNewNode(data);	
	//第二步,找到最后一个元素
	struct Node* tail = listhead;
	//移动指针,找到最后一个元素	
	while (tail->next!=NULL)//如果不空	
	{		
		tail = tail->next;	
	}	
	//第三步,循环退出,即找到最后一个元素,将最后一个元素的next指向新的节点	
	tail->next = newNode;
}
//6.指定位置前插入
void insertNewNodebyAppoint(struct Node* listhead, int data, int n)
{	
	struct Node* appointfront=listhead;	
	struct Node* appoint = listhead->next;	
	if (listhead == NULL)//链表为空的话就不用找了	
	{		
		printf("链表为空!!\n");		
		return;	
	}	
	else	
	{		
		while (appoint->data != n)		
		{			
			//如果未找到依此往后面移动				
			appoint = appoint->next;			
			appointfront = appointfront->next;			
			if (appoint == NULL)			
			{				
				printf("未能找到相关信息!!\n");				
				return;			
			}		
		} 		
		//如果循环退出,即找到,插入节点		
		//创建节点		
		struct Node* newNode = createNewNode(data);		
		appointfront->next = newNode;		
		newNode->next = appoint;	
		}
}
//7.表头删除
void deleteNodebyhead(struct Node* listhead)
{	
	//从链表的第2个元素开始删除	
	struct Node* deleteNode = listhead->next;		
	listhead->next = deleteNode->next;	
	free(deleteNode);	
	deleteNode = NULL;
}
//8.表尾删除
void deleteNodebytail(struct Node* listhead)
{	
	struct Node* tail = listhead;	
	struct Node* tailfront = NULL; 	
	while (tail->next != NULL) //找到表尾	
	{		
		tailfront = tail;		
		tail = tail->next;	
	}	
	free(tail);	
	tailfront->next = NULL;	
	tail = NULL; 
}
//9.指定位置删除
void deletNodebyAppoint(struct Node* listhead,int data)
{	
	struct Node* appointfront = listhead;	
	struct Node* appoint = listhead->next;	
	if (listhead == NULL)//链表为空的话就不用找了	
	{		
		printf("链表为空!!\n");		
		return;
	}	
	else	
	{		
		while (appoint->data != data)		
		{			
			//如果未找到依此往后面移动			
			appoint = appoint->next;			
			appointfront = appointfront->next;			
			if (appoint == NULL)			
			{				
				printf("未能找到相关信息!!\n");				
				return;			
			}		
		}		
		appointfront->next = appoint->next;		
		free(appoint);		
		appoint = NULL;	
	}
}
int main()
{	
	printf("表头插入,输入你要插入元素的个数\n");	
	int n;	
	scanf("%d", &n); 	
	struct Node* list = createlistHead();//创建头结点		
	for (int i = 0; i < n; i++)	
	{		
		int m;		
		scanf("%d", &m);		
		insertNewNodebyhead(list, m);	
	}	
	print(list);//打印list链表 	
	printf("表尾插入,请输入你要插入元素的个数\n"); 	
	int a;	
	scanf("%d", &a);	
	struct Node* list1 = createlistHead();	
	for (int i = 0; i < a; i++)	
	{		
		int b;		
		scanf("%d", &b);
		insertNewNodebytail(list1, b);
	}	
	print(list1); 	
	printf("在指定位置插入8元素:\n");	
	insertNewNodebyAppoint(list1, 8, 3);	
	print(list1); 	
	printf("表头删除\n");	
	deleteNodebyhead(list1);	
	print(list1); 	
	printf("表尾删除\n");	
	deleteNodebytail(list1);	
	print(list1); 	
	int k;	
	printf("指定位置删除,输入你想删除list中的元素:");	
	scanf("%d", &k);	
	deletNodebyAppoint(list, k);	
	print(list); 	
	system("pause");	
	return 0;
}

源代码和运行结果在图片上显示
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是C语言实现头结点单链表结点值按升序排列的代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } Node, *LinkedList; LinkedList createLinkedList(int n); void sortLinkedList(LinkedList head); void printLinkedList(LinkedList head); int main() { int n; printf("Enter the number of nodes: "); scanf("%d", &n); LinkedList head = createLinkedList(n); printf("Original linked list: "); printLinkedList(head); sortLinkedList(head); printf("Sorted linked list: "); printLinkedList(head); return 0; } LinkedList createLinkedList(int n) { LinkedList head = (LinkedList) malloc(sizeof(Node)); head->next = NULL; LinkedList tail = head; for (int i = 0; i < n; i++) { int data; printf("Enter the value of node %d: ", i + 1); scanf("%d", &data); LinkedList new_node = (LinkedList) malloc(sizeof(Node)); new_node->data = data; new_node->next = NULL; tail->next = new_node; tail = new_node; } return head; } void sortLinkedList(LinkedList head) { if (head->next == NULL || head->next->next == NULL) { return; } LinkedList p = head->next; head->next = NULL; while (p != NULL) { LinkedList q = p->next; LinkedList prev = head; while (prev->next != NULL && prev->next->data < p->data) { prev = prev->next; } p->next = prev->next; prev->next = p; p = q; } } void printLinkedList(LinkedList head) { LinkedList p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } ``` 该代码首先定义了一个`Node`结构体,包含了一个整数数据域和一个指向下一个结点的指针。然后定义了一个`LinkedList`类型,为指向结点的指针。接着定义了三个函数:`createLinkedList`用于创建一个头结点单链表,`sortLinkedList`用于将单链表中的结点值按升序排列,`printLinkedList`用于打印单链表中的所有结点的值。 在`main`函数中,首先让用户输入需要创建的单链表结点个数`n`,然后调用`createLinkedList`函数创建一个头结点单链表。接着打印原始单链表,调用`sortLinkedList`函数将单链表中的结点值按升序排列,再次打印排好序后的单链表。最后返回0表示程序正常结束。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值