Stockage de la chaîne de structure de données

Créez une liste liée individuellement et réalisez des fonctions de base telles que l'ajout, la suppression, la modification et la vérification

La structure linéaire est une ligne pour enchaîner toutes les données, elle est divisée en stockage linéaire (tableau et stockage discret (liste liée)

/*
 *	本例为非循环单链表 
 */ 
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node {
    
    
	int data;	//数据域
	struct Node * pNext;	//指针域 
}NODE, *PNODE;	//NODE等价于struct Node  PNODE等价于 struct Node * 

//函数声明
PNODE creat_list(void);
void traverseShow_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE);
bool insert_list(PNODE, int, int);
bool delete_list(PNODE, int, int *);
void sort_list(PNODE);
bool search_list(PNODE, int);

int main(void) {
    
    

	PNODE pHead = NULL;
	pHead = creat_list();	//创建一个非循环单链表,并将该链表头节点地址 给pHead	 
	
	traverseShow_list(pHead);	//遍历 链表 
	if(is_empty(pHead)) {
    
    
		printf("链表为空!\n");
	} else {
    
    
		printf("链表不空!\n");
	}
	printf("链表的长度为%d!\n", length_list(pHead));
	sort_list(pHead);
	insert_list(pHead, 2, 10);
	traverseShow_list(pHead);
	return 0;
}

PNODE creat_list(void) {
    
    
	int len;	//存放有效节点个数 
	int i;
	int val;	//用来存放用户临时输入结点的值 

	//头指针pHead指向头节点
	PNODE pHead = (PNODE)malloc(sizeof(NODE));	//分配一个不存放数据的头结点
	if(pHead == NULL) {
    
    
		printf("动态内存分配失败,程序终止!\n");
		exit(-1);
	}
	/*  pTail是尾节点 pHead是头指针
	 *	没有实际节点时,pTail 和 pHead共同指向头结点
	 *	链表空时,pHead本身就是尾节点 
	 * 	pTail应该永远指向尾节点
	 */ 
	PNODE pTail = pHead;
	pTail->pNext = NULL;	// 尾节点指针域为空 
	 
	printf("请输入链表长度:length = ");
	scanf("%d", &len);

	for(i = 0; i < len; i++) {
    
    
		printf("请输入第%d个节点的值:", i + 1); 
		scanf("%d",&val);
		//生成一个新的结构体指针,指向新生成的节点 
		PNODE pNew = (PNODE)malloc(sizeof(NODE)); 
		if(pNew == NULL) {
    
    
			printf("动态内存分配失败,程序终止!");
			exit(-1); 
		}
		pNew->data = val;	//给新节点数据域赋值 
		pTail->pNext = pNew;	//此时的pTail就是pHead,等价于pHead->pNext = pNew
		pNew->pNext = NULL;	//然后 新节点(尾节点)指针域为空
		pTail = pNew; 	//再使pTail和pNew指向新节点(pTail后移一位)
	}
	return pHead; 
}

void traverseShow_list(PNODE pHead) {
    
    
	PNODE p = pHead->pNext;

	while(p != NULL) {
    
    
		printf("%d  ", p->data);
		p = p->pNext;	//指针指向下一节点 
	}
	printf("\n");
	return;
}

bool is_empty(PNODE pHead) {
    
    
	//如果链表为空,则头节点指针域为空 
	if(pHead->pNext == NULL) {
    
    
		return true;
	} else {
    
    
		return false;
	}
}

int length_list(PNODE pHead) {
    
    
	int len = 0;
	PNODE p = pHead->pNext;
	while(p != NULL) {
    
    
		p = p->pNext;	//指向下一个节点 
		len++;
	}
	return len; 
}
/* 算法 : 
 * 		狭义的算法是与数据的存储方式密切相关 
 * 		广义的算法是与数据的存储方式无关 
 * 		泛型:
 * 			 利用某种技术达到的效果是:不同的存储方式,执行的操作相同 
 */
 /*冒泡法排序 
void sort_list(PNODE) {
	int i, j, t;
	//数据不连续就没有下标(方括号) 
	for(i = 0; i < len - 1; i++) {
		for(j = 0; j < len - 1 - i; j++) {
			if(a[j] > a[j + 1]) {
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}
}*/

//选择法排序
void sort_list(PNODE pHead) {
    
    
	int i, j, t;
	int len = length_list(pHead);
	PNODE p, q;
	for(i = 0, p = pHead->pNext; i < len - 1; i++, p = p->pNext) {
    
    
		for( j = i + 1, q = p->pNext; j < len; j++, q = q->pNext) {
    
    
			if(p->data > q->data) {
    
    	//类似于数组中的 a[i] > a[j]
				t = p->data;	//类似于数组中的 t=a[i] 
				p->data = q->data;//a[i]= a[j]
				q->data = t;	//a[j]=t
			}
		}
	}
}
//在pHead所指向链表的第pos个节点的前面插入一个新的节点,该节点数据为val 
bool insert_list(PNODE pHead, int pos, int val) {
    
    
	
	int i = 1;
	PNODE p = pHead;
	
	while(p != NULL && i < pos) {
    
    
		p = p->pNext;
		i++;
	}
	
	if(i > pos || p == NULL) {
    
    
		return false;
	}
	
	PNODE pNew = (PNODE )malloc(sizeof(NODE));
	if(pNew == NULL) {
    
    
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	
	pNew->data = val;
	PNODE q = p->pNext;	//q是临时节点
	p->pNext = pNew;
	pNew->pNext = q;
	return true;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_53703628/article/details/115371434
conseillé
Classement