数据结构——顺序表、链表(超详细,一文看懂,附代码)

什么是数据结构

1、定义:研究数据和数据之间关系的一门学科
2、定义一个好的程序
        简洁,高效,稳定,内存
        算法:增,删,改,查
3、解决某一问题的具体步骤
        特点:输入,输出,确定性,有穷性
        评判:高效(时间复杂度),空间(空间复杂度),简洁,
4、如何计算时间复杂度:
        1.求出时间频度的等式 (多项式求和)
        2.保留最高次数项
        3.系数化为 1

分类

逻辑结构:
        集合:
  • 有序集合,无序集合
        线形:首节点没有直接前驱,尾节点没有直接后继,其余节点有且只有一个前驱和后继        
  •  表,栈,队列
        树形:有且只有一个根节点,根节点没有直接前驱,有n 个后继( n>=0 , 其他节点有且只
       有一个前驱, n 个后继( n>=0 ;
  •         二叉树(平衡二叉树,红黑树,A树,B树。。。)
        图形, 节点可以有多个前驱和后继
  •         有向图,无向图,带权图,不带权图。。。
存储结构:
        顺序存储:存储地址是连续的,数组,malloc
        链式存储:链式存储
数据:
        定义:可以被计算机识别,处理,运算的符号统称数据数据项组成数据元素,数据元素组成数据

线性表

1、逻辑结构:线形
2、存储结构:顺序表,链表
3、顺序表:
                优点:简单,查找和修改非常快捷
                缺点:大小固定的,浪费空间,插入和删除比较费力
4、链表:
  • 单向不循环链表
        头节点的作用是同意插入代码,头插代码可以替换尾插代码
       头查时注意,必须先连后一根线
        末尾节点指向NULL
        特点:只能向一个方向遍历
  • 单项循环链表
        可以通过循环方式找到前面的节点
        末尾节点指向头节点
  • 双向链表
        可以通过pre 指针找到前面的节点
        末尾节点指向NULL
  • 双向循环链表
        末尾节点指向头节点

顺序表

头文件:

#ifndef _SQLISTE_H
#define _SQLISTE_H
//定义数组大小
#define SIZE 1024

//定义顺序表数据
typedef int sql_data_t;


//定义顺序表的类型
typedef struct sqliste{
	sql_data_t data[SIZE];
	int len;
}sql_node,* sql_pnode;

//创建
sql_pnode create_sqliste();

//插入
int insert_sqliste(sql_pnode L, sql_data_t data, int index);

//判满
int full_sqliste(sql_pnode L);

//打印顺序表
int show_sqliste(sql_pnode L);

//删除  按值删除
int delete_sqliste(sql_pnode L, sql_data_t data);

//判空
int empty_sqliste(sql_pnode L);

//清空
int clean_sqliste(sql_pnode L);

//修改  按位置修改
int change_sqliste(sql_pnode L, int index, sql_data_t data);

//查询  按位置查值
sql_data_t research_sqliste(sql_pnode L, int index);

//销毁  free 主函数的L指向NULL
int destory_sqliste(sql_pnode *L);

#endif

函数功能实现:创建 销毁 增 删 查 改 ......

#include "sqliste.h"
#include <stdlib.h>
#include <stdio.h>
sql_pnode create_sqliste()
{
	//创建顺序表的空间
	sql_pnode L = (sql_pnode)malloc(sizeof(sql_node));
	if(NULL == L)
	{
		return NULL;
	}
	
	//顺序表做初始化
	L->len = 0;
	
	return L;
}

//插入
int insert_sqliste(sql_pnode L, sql_data_t data, int index)
{
	//判断L是否有效
	if(NULL == L)
		return -1;
	
	//判满
	if(0 == full_sqliste(L))
		return -2;
	
	//判断插入位置 小于0 大于len
	if((index < 0 ) || (index > L->len))
		return -3;
	
	
	//从最后一个元素开始依次向后移动一位
	//指针写法
	/*
	data_t *start = L->data + index;
	data_t *end   = L->data + len-1;
	while(end >= start)
	{
		*(end+1) = *end;
		end--;
	}
	*/
	//数组写法
	int i;
	for(i = L->len-1; i >= index; i--)
	{
		L->data[i+1] = L->data[i];
	}
	
	//插入
	L->data[index] = data;
	
	L->len++;
	
	return 0;
}

//判满
int full_sqliste(sql_pnode L)
{
	if(NULL == L)
		return -1;
	
	if(L->len == SIZE)
		return 0;
	else
		return 1;
}

//打印顺序表
int show_sqliste(sql_pnode L)
{
	if(NULL == L)
		return -1;
	
	int i;
	for(i = 0; i < L->len; i++)
	{
		printf("data[%d]=%d ", i, L->data[i]);
	}
	puts("");

    return 0;
}

int empty_sqliste(sql_pnode L)
{
	if(NULL == L)
		return -1;
	
	if(0 == L->len)
		return 0;
	else
		return 1;
}

//清空
int clean_sqliste(sql_pnode L)
{
	if(NULL == L)
		return -1;
	
	L->len = 0;
	
	return 0;
}

//修改  按位置修改
int change_sqliste(sql_pnode L, int index, sql_data_t data)
{
	if(NULL == L)
		return -1;
	
	if(index < 0 || index > L->len-1)
		return -2;
	
	L->data[index] = data;
	
	return 0;
}

//查询  按位置查值
sql_data_t research_sqliste(sql_pnode L, int index)
{
	if(NULL == L)
		return -1;
	
	if(index < 0 || index > L->len-1)
		return -2;
	
	return L->data[index];
}

//删除  按值删除
int delete_sqliste(sql_pnode L, sql_data_t data)
{
	if(NULL == L)
		return -1;
	
	if(0 == empty_sqliste(L))
		return -2;
	
	//找到data 的下标
	int i,j;
	int flag = 0;
	for(i = 0; i < L->len; i++)
	{
		if(L->data[i] == data)
		{
			flag ++;
			//删除下标为i的值
			for(j = i; j < L->len; j++)
			{
				L->data[j]=L->data[j+1];
			}
			L->len--;
			i--;   //如果删除之后直接i++会跳过一个元素
		}
	}
	
	if(0 == flag)
		return -3;
	else
		return flag;
}


//销毁  free 主函数的L指向NULL
int destory_sqliste(sql_pnode* L)
{
	if(NULL == *L)
		return -1;
	
	//释放空间
	free(*L);
	//mian函数的L指向空
	*L = NULL;
	
	return 0;
}


测试主函数main:

#include <stdio.h>
#include "sqliste.h"

int main()
{
    sql_pnode L = create_sqliste();
    if(NULL == L)
    {
        printf("create is default\n");
        return -1;
    }
    puts("insert  0-5  index=2 data=520 index=3 data=520 ");
    int i;
    for(i = 0; i < 6; i++)
    {
        if(0 != insert_sqliste(L, i, i))
        {
            printf("insert is default\n");
            return -1;
        }
    }

    if(0 != insert_sqliste(L, 520, 2))
    {
        printf("insert is default\n");
        return -1;
    }
    
    if(0 != insert_sqliste(L, 520, 2))
    {
        printf("insert is default\n");
        return -1;
    }

    if(0 != show_sqliste(L))
    {
        printf("show is default\n");
        return -1;
    }

    puts("delete data=520 ");
    if(0 >= delete_sqliste(L,520))
    {
        printf("delete is default\n");
        return -1;
    }
    
    if(0 != show_sqliste(L))
    {
        printf("show is default\n");
        return -1;
    }

    puts("research index=3 ");
    sql_data_t data;
    if(0 > (data=research_sqliste(L, 3)))
    {
        printf("research is default\n");
        return -1;
    }
    printf("data=%d\n", data);

    puts("clean");
    if(0 != clean_sqliste(L))
    {
        printf("clean is default\n");
    }
    if(0 != show_sqliste(L))
    {
        printf("show is default\n");
        return -1;
    }
    
    puts("destory");
    if(0 != destory_sqliste(&L))
    {
        printf("destory is default\n");
        return -1;
    }
    if(0 != show_sqliste(L))
    {
        printf("show is default\n");
        return -1;
    }
    
    return 0;
} 

链表 (单向链表)

头文件:

#ifndef _LINKLIST_H
#define _LINKLIST_H

typedef int data_t;

typedef struct linklist
{
	data_t data;
	struct linklist* next;
}lk_node,*lk_pnode;

//
lk_pnode creat();
//
int len_linklist(lk_pnode H);
//
int insert_linklist(lk_pnode H,int location,data_t data);

//
int del_linklist(lk_pnode H,int location);
int delall_linklist(lk_pnode);
//
int cover_linklist(lk_pnode,int location,data_t data);
//
int inquire_linklist(lk_pnode H,int location);
//
int destory_linklist(lk_pnode* H);
//
void show_linklist(lk_pnode H);
//
int updown_linklist(lk_pnode H);
//
int inquireval_linklist(lk_pnode H,data_t data);
//
int sort_linklist(lk_pnode H);
#endif

函数功能实现:创建 销毁 增 删 查 改 .....

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"

//---------------------------------------------------
lk_pnode creat()
{
	lk_pnode H = (lk_pnode)malloc(sizeof(lk_node));
	if( NULL==H )
		return NULL;
	H->next = NULL;
	return H;
}
//--------------------------------------------------
int cover_linklist(lk_pnode H,int location,data_t data)
{
	if(NULL==H)
		return -1;
	if(location<0 || location>len_linklist(H))
		return -2;
	while(location)
	{
		H=H->next;
		location--;
	}
	H->next->data = data;
	return 0;
}
//---------------------------------------------------
int len_linklist(lk_pnode H)
{
	if(NULL==H)
		return -1;
	int len = 0;
	while(H->next != NULL)
	{
		H=H->next;
		len++;
	}
	return len;
}
//---------------------------------------------------
int del_linklist(lk_pnode H,int location)
{
	if(NULL == H)
		return -1;
	if(location < 0 || location > len_linklist(H))
		return -2;
	
	while(location)
	{
		H=H->next;
		location--;
	}
	lk_pnode b = H->next;
	H->next = H->next->next;
	free(b);
	return 0;
}
//----------------------------------------------------
int delall_linklist(lk_pnode H)
{
	if(NULL==H)
		return -1;
	if(0 == len_linklist(H))
		return -2;
	
	while(H->next != NULL)
	{
		lk_pnode B = H->next;
		H->next = B->next;
		free(B);
	}
	return 0;
}
//----------------------------------------------------
int insert_linklist(lk_pnode H,int location,data_t data)
{
	if(NULL==H)
		return -1;
	if(location<0 || location>len_linklist(H))
		return -2;

	while(location)
	{
		H = H->next;
		location--;
	}
	lk_pnode in = (lk_pnode)malloc(sizeof(lk_node));
	in->next = H->next;
	H->next = in;
	in->data = data;
	return 0;
}
//----------------------------------------------------
int inquire_linklist(lk_pnode H,int location)
{
	if(NULL==H)
		return -1;
	if(location<0 || location> len_linklist(H))
		return -2;
	while(location)
	{
		H=H->next;
		location--;
	}
	return H->next->data;
}

//----------------------------------------------------
int destory_linklist(lk_pnode* H)
{
	if(NULL == H)
		return 0;
	free(*H);
	return 0;
}
//-----------------------------------------------------
void show_linklist(lk_pnode H)
{
	while(H->next != NULL)
	{
		H=H->next;
		printf("%d  ",H->data);
	}
	puts("");
}
//-----------------------------------------------------
int updown_linklist(lk_pnode H)
{
	if(NULL==H)
		return -1;
	if(0 == len_linklist(H))
		return -2;
	lk_pnode E = H->next;
	H->next=NULL;
	while(E)
	{
	    lk_pnode B = E;
		E=E->next;
		B->next=H->next;
		H->next=B;
	}
	return 0;
}
//--------------------------------------------------------
int inquireval_linklist(lk_pnode H,data_t data)
{
		if(NULL==H)
			return -1;
		int scor = 0;
		int dex = 0;
		while(H->next != NULL)
		{
			H=H->next;
			if(H->data == data)
			{
				scor++;
				printf("......下标%d的值为%d\n",dex,data);
//				show_linklist(H,dex);
			}
			dex++;
		}
		if(0==scor)
			return -2;
			return 0;
}
//----------------------------------------------------------
int sort_linklist(lk_pnode H)
{
	if(NULL==H)
		return -1;
	if(0 == len_linklist(H))
		return -2;
	
	lk_pnode B = H->next;
	lk_pnode E = B;
	lk_pnode temp = H;
	H->next = NULL;
	
	while(B)
	{
		E = B;
		B = B->next;
		
		temp = H;  
		while(temp->next)
		{
			if(temp->next->data > E->data)
				break;
			temp = temp->next;
		}
	
		E->next = temp->next;
		temp->next = E;
	}
	return 0;
}

测试主函数main:

#include <stdio.h>
#include "linklist.h"

int main()
{
	lk_pnode H = creat();
	if(NULL == H)
		printf("......创建失败\n");
	else
		printf("......创建成功\n");
//----------------------------------
	for(int i=0;i<6;i++)
	{
		if(0 != insert_linklist(H,i,i+1))
			printf("......插入失败\n");	
		else
			printf("......将%d插入到%d号位置成功\n",i+1,i);
	}
	show_linklist(H);
//--------------------------------------
	if(0 != cover_linklist(H,2,99))
		printf("......修改失败\n");
	else
		printf("......修改成功  ");
	show_linklist(H);
//--------------------------------------
	printf("......2号位是%d\n",inquire_linklist(H,2));
	if(-2==inquireval_linklist(H,99))
		printf("链表中没有99这个值\n");
//--------------------------------------
	updown_linklist(H);
	show_linklist(H);
//--------------------------------------
	if(0 == sort_linklist(H))
		printf("......逆序成功  ");
	show_linklist(H);
//--------------------------------------
	if(0 != del_linklist(H,2))
		printf("......删除失败\n");
	else
		printf("......删除2号位成功  ");
	show_linklist(H);
//---------------------------------------
	if(0 != delall_linklist(H))
		printf("......清空失败\n");
	else
		printf("......清空成功\n");
	show_linklist(H);
//-------------------------------------------
	if(0 != destory_linklist(&H))
		printf("......销毁失败\n");
	else
		printf("......销毁成功\n");
	return 0;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值