数据结构-单链表(list)

一、概述

队列是数据结构中最常用的一种算法,核心是FFO(First In First Out),即先进先出,顶部出队列,底部入队列。

二、操作

 

三、代码

头文件

#ifndef _LIST_H_
#define _LIST_H_
#include <stdio.h>
#include <stdlib.h>

#define SUCCESS		0
#define FAIL	   -1
//链表的数据结构
typedef struct ListNode *pListNode;
typedef int DataType;//链表中的数据类型 
 
typedef struct ListNode{
	DataType *data;
	pListNode next; 
}sListNode;

typedef struct List{
	sListNode *head;
	int dataNum;
}sList;

void InitList();
int Insert(const DataType data);
int Delete(const DataType data);
int Query(const DataType *data); 
void Clear();
int Size();
void Print();
#endif

源文件

#include "list.h"
#include <string.h>

static sList gList;

static void DataCopy(DataType *newData, const DataType *oldData){
	memcpy(newData,oldData,sizeof(DataType));
}

static int DataCmp(DataType *newData, const DataType *oldData){
	return memcmp(newData,oldData,sizeof(DataType));
}

void InitList(){
	gList.dataNum = 0;
	gList.head = NULL;
}
 
int Insert(const DataType data){
	pListNode node = (pListNode)malloc(sizeof(sListNode));
	node->data = (DataType *)malloc(sizeof(DataType));
	DataCopy(node->data,&data);
	node->next = NULL;
	
	if(NULL == gList.head)
	{
		gList.head = node;
	}
	else
	{
		node->next = gList.head;
		gList.head = node;
	}
	
	gList.dataNum++;
	return SUCCESS;	
}
 
int Delete(const DataType data){
	if(NULL == gList.head){
		return FAIL;
	}

	pListNode head = gList.head;
	pListNode next = NULL;	
		
	if(0 == DataCmp(gList.head->data,&data))
	{
		gList.head = head->next;
		free(head->data);
		free(head);
		gList.dataNum--;
		return SUCCESS;
	}
	else
	{
		next = head->next;
		
		while(next){
			if(0 == DataCmp(next->data,&data))
			{
				head->next = next->next;
				free(next->data);
				free(next);
				gList.dataNum--;
				return SUCCESS;				
			}
			
			head = next;
			next = head->next;
		}
	}
	
	return FAIL;	
}
 
int Query(const DataType *data){
	pListNode node = gList.head;
	
	while(node){
		if(0 == DataCmp(node->data,data)){
			return SUCCESS;
		}
	}
	
	return FAIL;
}
 
void Clear(){
	pListNode node = NULL;
	 
	while(gList.head)
	{
		node =  gList.head;
		gList.head = gList.head->next;
		free(node->data);
		free(node);		
	}
	
	InitList();
}

int Size(){
	return gList.dataNum;
}

void Print(){
	pListNode node = gList.head;
	printf("size:%d\n",gList.dataNum);
	
	while(node)
	{
		printf("%d ",*node->data);
		node = node->next;	
	}
	
	printf("\n");	
}

测试文件

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	InitList();
	Insert(1);
	Insert(2);
	Print();
	Delete(2);
	Print();
	Delete(1);
	Print();	
	return 0;
}

测试结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C语言实现的单链表原地逆转的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void reverseList(struct Node** head) { struct Node* prev = NULL; struct Node* current = *head; struct Node* next = NULL; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } *head = prev; } void printList(struct Node* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } void push(struct Node** headRef, int newData) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newData; newNode->next = *headRef; *headRef = newNode; } int main() { struct Node* head = NULL; push(&head, 3); push(&head, 2); push(&head, 1); printf("Original list: "); printList(head); reverseList(&head); printf("Reversed list: "); printList(head); return 0; } ``` 在上述代码中,我们首先定义了一个 `Node` 结构体来表示单链表中的每个节点,包括节点的值和指向下一个节点的指针。然后我们定义了 `reverseList` 函数来实现原地逆转单链表的功能。该函数接受一个指向指针的指针 `head`,这是因为我们需要通过指针来修改单链表的头节点,所以我们传递指向指针的指针。在函数内部,我们使用三个指针 `prev`、`current` 和 `next` 来依次遍历单链表,并将每个节点的指针指向前一个节点,从而实现原地逆转单链表的目的。 最后,我们定义了一个 `push` 函数来添加新节点到单链表的头部,并定义了 `printList` 函数来打印单链表中所有节点的值。在 `main` 函数中,我们创建了一个包含三个节点的单链表,并调用 `reverseList` 函数来原地逆转该单链表,最后打印出原始和逆转后的单链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值