顺序表和单链表的代码实现

avatar
作者
筋斗云
阅读量:0

代码位置:数据结构: 总结 - Gitee.com

需要代码并且需要运行结果的可以进入链接自行领取。

顺序表:是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

链表:是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间 大小,所以下面我们实现动态顺序表。

 1.SeqList.h

#pragma once  #include<stdio.h> #include<stdlib.h> #include<assert.h>  typedef int SLDataType; #define INIT_CAPACITY 4  typedef struct S { 	SLDataType* a; 	int sz; 	int capacity; }SL;  //顺序表的初始化 void SLInit(SL* pc);  //尾插 void SLPushBack(SL* pc,SLDataType x);  //尾删 //void SLPopback(SL* pc);  //扩容 void SLCheckCapacity(SL* pc);  //插入 void SLInsert(SL* pc,int pos,SLDataType x);  //查找 void SLFine(SL* pc, SLDataType x);  //删除 void SLErase(SL* pc, int pos);  //打印 void SLPrint(SL* pc);  //修改 void SLModify(SL* pc, int pos, SLDataType x);  //销毁 void SLDestroy(SL* pc);

2.Seqlist.c

#define _CRT_SECURE_NO_WARNINGS 1  #include"SeqList.h"   void SLCheckCapacity(SL* pc) { 	assert(pc);  	if (pc->sz == pc->capacity) 	{ 		SLDataType* tmp = (SLDataType*)realloc(pc->a, sizeof(SLDataType) * pc->capacity * 2); 		if (tmp == NULL) 		{ 			perror("realloc"); 			return; 		} 		pc->a = tmp; 		pc->capacity *= 2; 	} }  void SLInit(SL* pc) { 	pc->a = (SLDataType*)malloc(sizeof(SLDataType*)*INIT_CAPACITY); 	if (pc->a == NULL) 	{ 		perror("malloc"); 		return; 	} 	pc->sz = 0; 	pc->capacity = INIT_CAPACITY; }  void SLPushBack(SL* pc,SLDataType x) { 	SLCheckCapacity(pc); 	pc->a[pc->sz] = x; 	pc->sz++; }   void SLPrint(SL* pc) { 	for (int i = 0; i < pc->sz; i++) 	{ 		printf("%d ", pc->a[i]); 	} 	printf("\n"); }  void SLDestroy(SL* pc) { 	assert(pc); 	free(pc->a); 	pc->a = NULL; 	pc->sz = pc->capacity = 0; }  void SLInsert(SL* pc,int pos, SLDataType x) { 	assert(pc); 	assert(pos >= 0 && pos <= pc->sz); 	//扩容 	SLCheckCapacity(pc);  	int end = pc->sz - 1; 	while (end >= pos) 	{ 		pc->a[end + 1] = pc->a[end]; 		end--; 	} 	pc->a[pos] = x; 	pc->sz++; }   void SLErase(SL* pc,int pos) { 	assert(pc); 	assert(pos >= 0 && pos < pc->sz); 	int begin = pos; 	while (begin < pc->sz - 1) 	{ 		pc->a[begin] = pc->a[begin + 1]; 		begin++; 	} 	pc->sz--; }  void SLFine(SL* pc, SLDataType x) { 	assert(pc);  	for (int i = 0; i < pc->sz; i++) 	{ 		if(pc->a[i] == x) 			return i; 	} 	return -1; }  void SLModify(SL* pc, int pos, SLDataType x) { 	assert(pc); 	assert(pos >= 0 && pos < pc->sz); 	pc->a[pos] = x; }

链表的实现

 1.SList.h

#define _CRT_SECURE_NO_WARNINGS 1  #include <stdio.h> #include<stdlib.h> #include<assert.h> typedef int SLTistDataType;  typedef struct SListNode { 	SLTistDataType data; 	struct SListNode* next; }SLTNode;   //打印 void SLTPrint(SLTNode* phead);  //尾插 void SLTPushBack(SLTNode** pphead, SLTistDataType x);  //尾删 void SLTPopBack(SLTNode** pphead);  //头插 void SLTPushFront(SLTNode** pphead, SLTistDataType x);  //头删 void SLTPopFront(SLTNode** pphead);  //查找 SLTNode* SLTFind(SLTNode* phead, SLTistDataType x);  //在pos前插入 void SLTInsert(SLTNode** pphead, SLTNode *pos, SLTistDataType x);  //在pos处删除 void SLTErase(SLTNode** pphead, SLTNode* pos);

2.SList.c

#define _CRT_SECURE_NO_WARNINGS 1  #include"SList.h"  void SLTPrint(SLTNode* phead) { 	SLTNode* str = phead; 	while (str) 	{ 		printf("%d->", str->data); 		str = str->next; 	} 	printf("NULL\n"); }  SLTNode* NewSLTNode(SLTistDataType x) { 	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); 	if (newnode == NULL) 	{ 		perror("malloc"); 		return NULL; 	} 	newnode->data = x; 	newnode->next = NULL; 	return newnode; }  void SLTPushBack(SLTNode** pphead, SLTistDataType x) { 	SLTNode* tail = *pphead; 	/*SLTNode* newnode=(SLTNode*)malloc(sizeof(SLTNode)); 	if (newnode == NULL) 	{ 		perror("malloc"); 		return; 	}*/ 	SLTNode* newnode = NewSLTNode(x); 	if (*pphead == NULL) 	{ 		*pphead = newnode; 	} 	else 	{ 		while (tail->next != NULL) 		{ 			tail = tail->next; 		} 		tail->next = newnode; 	} 	/*newnode->data = x; 	newnode->next = NULL;*/ }   void SLTPopBack(SLTNode** pphead) { 	//断言 	assert(*pphead);  	if (*pphead == NULL) 	{ 		return; 	} 	if ((*pphead)->next = NULL) 	{ 		free(*pphead); 		*pphead = NULL; 		return; 	} 	else 	{ 		/*SLTNode* pre = *pphead; 		SLTNode* tail = *pphead; 		while (tail->next != NULL) 		{ 			pre = tail; 			tail = tail->next; 		} 		free(tail); 		tail = NULL; 		pre->next = NULL;*/ 		 		SLTNode* tail = *pphead; 		while (tail->next->next != NULL) 		{ 			tail = tail->next; 		} 		free(tail->next); 		tail->next = NULL; 	} }   void SLTPushFront(SLTNode** pphead, SLTistDataType x) { 	SLTNode* newnode = NewSLTNode(x); 	newnode->next = *pphead; 	*pphead = newnode; }  void SLTPopFront(SLTNode** pphead) { 	//暴力检查 	assert(*pphead);  	if (*pphead == NULL) 	{ 		return; 	}  	/*SLTNode* frist = *pphead; 	*pphead = frist->next; 	free(frist); 	frist = NULL;*/ 	SLTNode* frist = *pphead; 	*pphead = (*pphead)->next; 	free(frist); 	frist = NULL; }  SLTNode* SLTFind(SLTNode* phead, SLTistDataType x) { 	SLTNode* cur = phead; 	while (cur) 	{ 		if (cur->data == x) 		{ 			return cur; 		}  		cur = cur->next; 	}  	return NULL; }  void SLTInsert(SLTNode** pphead, SLTNode *pos, SLTistDataType x) { 	assert(pos); 	assert(pphead);  	if (pos == *pphead) 	{ 		SLTPushFront(pphead, x); 	} 	else 	{ 		// 找到pos的前一个位置 		SLTNode* prev = *pphead; 		while (prev->next != pos) 		{ 			prev = prev->next; 		}  		SLTNode* newnode = NewSLTNode(x); 		prev->next = newnode; 		newnode->next = pos; 	} }  void SLTErase(SLTNode** pphead, SLTNode* pos) { 	assert(pphead); 	assert(pos); 	assert(*pphead);  	if (pos = *pphead) 	{ 		SLTPopFront(pphead); 	}  	SLTNode* cur = *pphead; 	while (cur->next != pos) 	{ 		cur = cur->next; 	} 	cur->next = pos->next; 	free(pos); 	pos = NULL;  } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!