严蔚敏数据结构C语言版 线性表的增删改查功能(完全自己敲的)
/*
严蔚敏数据结构C语言版
顺序线性表的综合程序(增删改查)
*/
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//宏区
#define List_capacity 100 //线性表L的初始容量
#define List_appreciation 10 //线性表L的初始容量不足时分配的增量
//结构
typedef struct //结构
{
int *elem; //用于指向动态连续分配的存储空间的首地址
int length; //当前线性表L的长度
int list_size; //当前线性表L的存储容量
}Sqlist;
//函数区
void List_initialize(Sqlist *L) //线性表L的初始化
{
L->elem = (int *)malloc(List_capacity * sizeof(int)); //分配了一段List_capacity动态连续存储的空间并把首地址发送给L->elem
if (!L->elem)
{
printf("初始化分配失败,检查程序!\n"); //输出信息,出问题时候方便查找问题所在地
exit(1); //非正常退出程序,终止程序
}
else
printf("初始化成功,请继续下一步操作:\n");
L->length = 0; //未赋值,线性表L的初始化长度为0
L->list_size = List_capacity; //记录已经为线性表L分配了List_capacity长度的存储容量
}
void List_The_default_value(Sqlist *L) //线性表L的默认赋值
{
int i, j;
L->elem[0] = NULL; //初始化线性表L的下标为0的元素为0
for (i = 1;i <= 10;i++) //从1开始依次赋值给线性表L的每个元素,到10为止
{
L->elem[i] = i; //将i值赋于将下标为i的元素
L->length++; //每赋值一个数将线性表L的长度自增一次
if (L->length > L->list_size) //如果线性表L的当前长度大于了线性表L的容量
{
int * new1;
new1 = (int *)realloc(L->elem, (L->length + List_appreciation) * sizeof(int)); //重新分配L->elem的存储空间并临时用new1指向
if (!new1) //如果分配失败
{
printf("赋值时容量不够,进行增值分配但分配失败请检查程序!\n"); //显示错误,用于方便查找位置
exit(1); //非正常退出程序,终止程序
}
L->elem = new1; //将new1内的地址发送给L->elem使线性表L指向新分配的空间
L->list_size = L->length + List_appreciation; //记录容量
}
}
printf("当前线性表L的元素值为:"); //用于提示用户线性表L内的值
for (j = 1;j <= L->length;j++) //依次输出线性表L的值
printf("%d ", L->elem[j]);
printf("\n赋值成功请进行下一步操作:\n\n\n"); //赋值成功
}
void List_insert(Sqlist *L) //线性表的插入(增)
{
int i, j, e, k;
/* //这个判断有问题,暂时不清楚!!!!!!!
char val;
printf("是否需要增添值?(Y/N):"); //判断用户是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即继续执行,若是'N'或'n'则返回主函数
return 0;
printf("\n");
*/
printf("请输入你要插入的位置:");
scanf("%d", &i); //输入插入的位置
printf("请输入你要插入的值为:");
scanf("%d", &j); //输入插入的值
while (i < 1 || i > L->length) //插入的值不合法,就重新输入
{
printf("你输入的值不合法,请重新输入:\n");
printf("请输入你要插入的位置:");
scanf("%d", &i);
}
if (L->length >= L->list_size) //如果线性表L的当前长度大于了线性表L的容量
{
int * new1;
new1 = (int *)realloc(L->elem, (L->length + List_appreciation) * sizeof(int)); //重新分配L->elem的存储空间并临时用new1指向
if (!new1) //如果分配失败
{
printf("赋值时容量不够,进行增值分配但分配失败请检查程序!\n"); //显示错误,用于方便查找位置
exit(1); //非正常退出程序,终止程序
}
L->elem = new1; //将new1内的地址发送给L->elem使线性表L指向新分配的空间
L->list_size = L->length + List_appreciation; //记录容量
printf("\n本次插入,已经超过了原有存储容量,现已增加容量\n"); //提示用户增值的操作
}
for (e = L->length;i <= e;e--) //从线性表L最后一个元素开始依次往后移动,直到i的位置空出来
L->elem[e + 1] = L->elem[e]; //将线性表L的最后一个元素向后移动
L->elem[i] = j; //将需要插入的值j插入到指定位置i
L->length++; //记录长度
printf("插入成功,线性表内的元素为:");
for (k = 1;k <= L->length;k++) //依次打印插值后的线性表L的各个元素
printf("%d ", L->elem[k]); //打印
printf("\n");
}
void List_drop(Sqlist *L) //线性表的删除(删除)
{
int i = 0, j, t, k;
/* //这个判断有问题,暂时不清楚!!!!!!!
char val;
printf("是否需要删除值?(Y/N):"); //判断用户是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即继续执行,若是'N'或'n'则返回主函数
return 0;
printf("\n");
*/
printf("请输入你要删除的值:");
scanf("%d", &j);
printf("删除成功,你删除的值是:%d\n", L->elem[j]);
for (;i <= L->length;i++)
if (L->elem[i] == j)
{
L->elem[i] = NULL;
k = i;
}
for (;k <= L->length;k++) //将删除的位置的下一位依次往前移动
L->elem[k] = L->elem[k + 1];
L->length--; //记录当前线性表的长度
printf("删除后的线性表的值为:");
for (t = 1;t <= L->length;t++) //依次输出删除后线性表L的各个元素
printf("%d ", L->elem[t]);
printf("\n");
}
void List_change(Sqlist *L) //线性表的更改(改)
{
int i = 0, j, t, m;
/* //这个判断有问题,暂时不清楚!!!!!!!
char val;
printf("是否需要更改值?(Y/N):"); //判断用户是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即继续执行,若是'N'或'n'则返回主函数
return 0;
printf("\n");
*/
printf("输入更改的位置:");
scanf("%d", &j); //输入要改的值
printf("输入要更改成的值:");
scanf("%d", &t); //输入要改的位置
while (j < 0 && j > L->length) //判断改的位置是否有误
{
printf("改的位置有误,请重新输入改的位置:");
scanf("%d", &j);
}
L->elem[j] = t; //将需要改的位置上的元素改为j
for (m = 1;m <= L->length;m++) //打印输出
printf("%d ", L->elem[m]);
printf("\n");
}
void List_examine(Sqlist *L) //线性表的查找(查)
{
int i, j;
/* //这个判断有问题,暂时不清楚!!!!!!!
char val;
printf("是否需要增添值?(Y/N):"); //判断用户是否需要添加新值
scanf("%c", &val);
if (val == 'N' || val == 'n') //如果是'Y'或'y'即继续执行,若是'N'或'n'则返回主函数
return 0;
printf("\n");
*/
printf("请输入你要查找的值:");
scanf("%d", &i);
for (j = 1;j <= L->length;j++)
if (i == L->elem[j])
printf("查找值为:%d,它的位置是:%d\n", i, j);
}
int main(void) //主函数
{
Sqlist L;
List_initialize(&L); //线性表L的初始化
List_The_default_value(&L); //线性表L的默认赋值
printf("完全初始化线性表结束,顺序线性表(增删改查)功能开始:\n\n\n");
List_insert(&L); //线性表的插入(增)
List_drop(&L); //线性表的删除(删)(删除在表中符合指定的值)
List_examine(&L); //线性表的查找(查)
List_change(&L); //线性表的更改(改)
return 0;
}
我对于一些代码的理解不是很透彻,就像该文章所一样的,被我打上注释的那串代码,我想着用户可以自己选择是否使用该功能,可是很奇怪,会有问题,第一个模块的询问是正常的当第二个模块再次询问时就直接跳过,这个程序是2星期前敲的,我现在也无法理解。
我能是一名中职生16岁,很遗憾当时没好好学,不过现在是真的很想提升自己了,我想考本考研不仅仅是对我的改变更多是我可以但我不想在把自己葬送在手上,环境,师资,资源等其实我几乎都没有,几乎是自己一个人慢慢的接受和习惯了,我每天的学习时间是14小时左右,以后也不会变,这篇博客是我成长的开始
我已经正式接触软件编程有8个月了吧,我一开始学习的是HTML/CSS/JavaScript,后来遇见了一个很好的指导老师,于是我转向了后端,
C语言学习了4个月,我大致算了一下,1360个小时左右因为每天几乎都是除了吃饭睡觉就是学习这一门,学完后老师让我学习数据结构,一开始我看的是大话数据结构,1个月左右,大致300小时,我理解了框架和步骤,但不是很熟练,然后老师让我在学习C语言,我买了谭浩强的第五版C语言学习把书上的代码和习题全敲了一遍,后来又不看书去敲了一遍,查漏补缺了很多。
花了很长2个月把,然后老师让我休息,我其实觉得提升自己是一件很有激情的事情,我很乐意也很愿意,与其说休息这就是我自己的休息方式。
放寒假之前一个月我开始学习MYSQL,一直到现在我的计划主要是这样的且一直有条有序的执行着:
6:00-7:00 是 补习理论知识(计算机组装,计算机网络这些知识一本一本的学)
7:00-10:00 是 MYSQL;
10:00-13:00 是 C++;
14:00 - 16:30 是 C语言的细读理解每一句话
16:00-18:30 是数据结构严蔚敏的
一直到0:00是补习我的数学和英语
链表的一些也打了,有时间就记录发,
我的目前主要方向是C/C++,学习理解好后,大专开始专攻互联网网站Java web等技术不断扩展,学习前端,后端,数据库,框架,UI设计等等都会涉及且对我有用的会重点学习,我一直坚信T型发展才是我的路。
但是,我也很迷茫,我不知道我应该怎样的系统的规划和路线去学习Java等后面的路线。但是,我不会停下!我热爱且不止于热爱~
且剩余时间我学习了吉他,钢琴~
元月底会有演出,虽然是内部的但也证明我不是空谈
以下是目前为止记录的学习时间:
我发这些也许会说我掺水了,但事实胜于雄辩,我每次的记录都会记录我的成长,而如何要达到的程度我想我的一切都在表里了~
谢谢观看我的第一篇博客~
再次感谢