全面了解数据结构之顺序表

此为顺序表的一个C语言实现过程,其中对每一行代码进行了标注,同时为了方便理解顺序表的存储,逻辑与物理是相同的。也将存储地址一同显示出来了。

#include<stdio.h>
#include<stdlib.h>
#define MAX 1024
typedef struct
{
	int data[MAX];//data是个数组,定义了最大长度的数组
	int last;//就是个位置,没有特殊含义
}linearlist;

//定义指针是传入地址,直接对数进行操作 
void Listlist(linearlist* list)
{
	int i;
	printf("当前线性表的状态:\n");
	if(list->last==0)//声明对象list,对象内赋值位置成员last
		printf("当前顺序表为空");
	else
		for(i=0;i<(list->last);i++)
			printf("注释正在遍历数组,输出所有值\n");
			printf("[%4d]",list->data[i]);//小于值,则遍历输出数组
	printf("\n");	

}

void Output(linearlist* list)
{



	system("cls");
	printf("----------------顺序表--------------\n");
	printf("- a:追加一个节点      i:插入一个节点  -\n");
    printf("- d:删除一个节点      e:退出  -\n");
	printf("--------------升级版----------------\n");
	printf("此时顺序表(数组)的长度:%d\n",list->last);//list的last是从0开始的
		int i;
		for(i=0;i<list->last;i++)//35
	printf("数据是%d,存储地址是%d\n",list->data[i],&list->data[i]);//34
	Listlist(list);
}


linearlist* CreateList()
{
	linearlist* list=(linearlist*)malloc(sizeof(linearlist));//分配地址空间,相当于java、c++的new方法
	list->last=0;//对第一个赋值为零,此时数组内为0
	return list;
}

void AppendNode(linearlist* list,int n)//追加结点
{
	if(list->last<MAX)//如果此时最后一个数的位置小于预定义的数组的长度,则执行
	{
		list->data[list->last]=n;//直接定位到数组的相应元素
		list->last+=1;//数组或顺序表的长度
	
	}
}

void InsertNode(linearlist* list,int n,int pos){//插入结点

	int j;
	if(pos<0||pos>(list->last))//53
	printf("超出顺序表的范围!");
	else
	{
		for(j=list->last;j>=pos;j--)
			list->data[j+1]=list->data[j];//插入结点后每个元素向后移动一个单位
		list->data[pos]=n;//对插入的单位进行赋值
		list->last++;//最大值增加一个
	}
}

void DeleteNode(linearlist* list,int pos)//删除结点
{
	int j;
	if(pos<0||(pos>list->last))//超出数组范围
		printf("删除的节点位置超出顺序标的范围!");
	else
	{
		for(j=pos;j<list->last;j++)
			list->data[j]=list->data[j+1];//每个数据都向前移动一个位置
		list->last--;

	}
}


void pritln(linearlist* list)
{

	int i;
	for(i=0;i<list->last;i++)//35
	printf("数据是%d,存储地址是%d\n",list->data[i],&list->data[i]);//34
}

int main()
{
	int key,pos;
	char ch;
	linearlist* list;
	list=CreateList();
	while(1)//此处是一个无限循环
	{
		Output(list);//每次添加完数据后都执行此语句,清空界面
		printf("请选择");
		ch=getchar();
		fflush(stdin);
		if(ch=='a')
		{
			printf("请输入要追加的数据");
			scanf("%d",&key);
			AppendNode(list,key);

		}
		else if(ch=='i')
		{
			printf("请输入要插入的位置");
			scanf("%d",&pos);//100
			printf("请输入要插入的数据");
			scanf("%d",&key);
			InsertNode(list,key,pos);

		}
		else if(ch=='d')
		{
			printf("请输入要删除的位置");
			scanf("%d",&pos);
			DeleteNode(list,pos);


		}
		else if(ch=='e')
		exit(0);
		Output(list);
		fflush(stdin);//清空输入输出
	}
	pritln(list);

	return 0;
}

本文是根据课本《C语言从入门到精通》中的顺序表整理出来的。如有侵权,请直接联系我。本博客将会很快删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值