/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013,郑州大学SIAS国际学院
* 文件名称: 线性表子系统
* 作 者: 王 杰
* 完成日期:2013 年 10 月 25 日
* 对任务及求解方法的描述部分:
* 输入描述: 详见代码及注释
* 问题描述: 详见代码及注释
* 程序输出: 详见代码及注释
* 问题分析: 详见代码及注释
* 算法设计: 详见代码及注释
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct linknode
{ char data;
struct linknode *next;
}linnode;
linnode *head; //头指针
int n; //定义表的长度
//定义建表函数1
void CreateList()
{ n=0;
char x;
linnode *p,*s;
int z=1;
head=new linnode;
p=head;
printf("\n请逐个输入结点,以x为结束标记!\n");
printf("\n");
while(z)
{ printf("输入一个字符数据,并按回车:");
scanf("%c",&x);
getchar();
if(x!='x'){
s=new linnode;
n++;
s->data=x;
p->next=s;
s->next=NULL;
p=s;
}
else z=0;
}
}
//定义插入函数2
void InsList(int i,char x)
{ linnode *s,*p;
p=head;
int j=0;
while(p!=NULL&&j<i)
{ j++;
p=p->next;
}
if(p!=NULL)
{ s=new linnode;
s->data=x;
s->next=p->next;
p->next=s;
n++;
}
else printf("\n线性表为空或插入位置超出!\n");
}
//定义删除函数3
void DelList(char x)
{ linnode *p,*q;
if(head==NULL)
{ printf("\n链表下溢!"); //不带头结点的空表
return;
}
if(head->next==NULL)
{ printf("\n线性表已经为空!"); //带头结点的空表
return;
}
q=head; //非空表,当还没有到表尾和还没有找到正确的值时,继续做循环,直到找到为止,找到后执行下一句
p=head->next;
while(p!=NULL&&p->data!=x)
{ q=p;
p=p->next;
}
if(p!=NULL) //如果在还没有到表尾的前提下,找到了,删除!
{ q->next=p->next;
delete p;
n--;
printf("\n结点 %c 已经被删除!",x);
}
else printf("\n抱歉!没有找到您要删除的结点。"); //如果已经到表尾了还没有找到,报错!,没有找到该节点
}
//定义显示函数4
void ShowList()
{ linnode *p=head;
printf("\n显示线性表的所有元素:");
if(head->next==NULL||p==NULL) //空表
printf("\n链表为空!");
else
{ printf("\n");
while(p->next!=NULL) //非空表,循环输出各个数据元素的数据域,直到p->next为空(表尾)时结束
{ printf("%5c",p->next->data);
p=p->next;
}
}
}
//定义查找函数5
void SearchList(char x)
{ linnode *p;
int i=1;
if(head==NULL)
{ printf("\n链表下溢!"); //不带头结点的空表
return;
}
if(head->next==NULL)
{ printf("\n线性表为空,没有任何结点!"); //带头结点的空表
return;
}
p=head->next; //非空表,当还没有到表尾并且还没有找到值时,继续做循环
while(p!=NULL && p->data!=x)
{ p=p->next;
i++;
}
if(p!=NULL)
printf("\n在表的第 %d 位上找到值为 %c 的结点!",i,x); //在不是表尾的前提下,找到了值,就输出
else
printf("\n抱歉,未找到值为 %c 的结点!",x); //表已经结束,还没有找到,报错。没有找到
}
//定义主函数
void main()
{ head=NULL;
int choice,i,j=1;
char x;
while(j)
{ printf(" 线性表子系统 \n");
printf("*********************************\n");
printf("* 1------建 表 *\n");
printf("* 2------插 入 *\n");
printf("* 3------删 除 *\n");
printf("* 4------显 示 *\n");
printf("* 5------查 找 *\n");
printf("* 6------求 表 长 *\n");
printf("* 0------返 回 *\n");
printf("*********************************\n");
printf(" 请选择输入的数字(0--6):");
scanf("%d",&choice);
getchar();
if(0<=choice<=6)
{ if(choice==1)
CreateList();
if(choice==2)
{ printf("\n请输入插入的位置i和插入的数据(输入格式:第i位后面,值为x):");
scanf("%d,%c",&i,&x);
InsList(i,x);
}
if(choice==3)
{ printf("\n请输入要删除的数据元素:");
scanf("%c",&x);
DelList(x);
}
if(choice==4)
if(head==NULL)
printf("\n请先建立线性表!");
else
ShowList();
if(choice==5)
{ printf("\n请输入要查找的数据元素:");
scanf("%c",&x);
SearchList(x);
}
if(choice==6)
printf("\n线性表长度为:%d",n);
if(choice==0)
j=0;
}
else
printf("\n输入错误!请重新输入!");
}
}
心得:就在这几天,突然对计算机又有了一些较深或者说更加贴切,亲近的赶脚,那种赶脚很是美妙。
总结:这个子系统写了很长时间,在写的时候稍微有一点无所适从,数据结构的内容,各个函数的核心算法都很是理解,但是在考虑整体的时候 有那么一点无从下手的赶脚,细心地想想,可能就是因为写的不多,还没有让 编程成为一种惯性吧,所以还要继续的做题,不管是简单的还是复杂的,现在就是在找那个赶脚。由难而易,循序渐进,逐步提升自己的水平,相信用不了几天 ,就可以熟门熟路了,慢慢的过渡到复杂的有难度的题目上! 干吧得!!!
感悟:持之以恒者,必成大器

1024

被折叠的 条评论
为什么被折叠?



