数据结构用c实现线性表子系统
来源:互联网 发布:阿里员工开除 知乎 编辑:程序博客网 时间:2024/05/22 05:40
老师课堂上布置的任务,然后 莫名的感觉老师高估我们的水平了
这程序我真的不会自己编,所以百度到两组关于线性表子系统的代码
我也不知道为什么会莫名的想传到博客上
反正 反正我心情好 我乐意
-------------------------------------我是萌萌哒的分割线-------------------------------------
第一组代码
#include<stdio.h>
#include<stdlib.h>//因为使用malloc动态空间
#define N sizeof(node)
// 结点定义
typedef struct linknode
{
char data;
struct linknode * next;
}node,*linklist;
node *head; // 定义一个全局头指针
//建表并且输入内容,结束标记位‘#
void InputList()
{
node *r,*s;
char x;
int T=1,n=0;
head=(node*)malloc(N);
r=head;
printf("\n\t建立一个线性表");
printf("\n\t请逐个输入字符,结束标记位‘#’\n");
while(T)
{
printf("\t\t请输入:");
fflush(stdin);//===============为什么必须加上 scanf("%c",&x);才不会出现 ”两遍的 请输入: 请输入:“
/*清除标准输入设备(一般是键盘)的缓存。往往适用于截获输入特殊值,例如每次读取一个输入的字符,
但是如果你输完一个字符后敲了回车,回车是一个特殊的键,会产生2个字符,因此程序会认为你输入了3个字符,
此时可以用读取一个字符后用这个函数清除键盘缓存,从而清除回车的影响。*/
scanf("%c",&x);
if(x!='#')
{
s=(node*)malloc(T);
n++;
s->data=x;
r->next=s;
s->next=NULL;
r=s;
}
else T=0;
}
//printf("\n请输入所要达到第几号功能:\t");
}
//输出链表中各个结点
void ShowList()
{
node *p;
p=head->next;
printf("表中内容为:\t");
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
//printf("\n请输入所要达到第几号功能:\t");
}
//查询链表中的某个元素(当“插入数据“或者“删除数据”时函数调用的函数)
node *FindList_number(int i)
{
int j=0;
node *p;
p=head->next;
while((p->next)!=NULL&&(j<i))
{
p=p->next;
j++;
}
if(j==i)
return p;
else printf("输入数据错误!!!");
}
//查找链表中的某一个元素
void FindList()
{
char x;
int i=1;
node *p;
printf("\t\t请输入所要查询的元素x:\t");
//x=getchar();
//getchar();
fflush(stdin);
scanf("%c",&x);
if(head==NULL)
printf("\t该链表只有头指针!!");
if(head->next==NULL)
printf("\t该线性表为空!\n");
p=head->next;
while(p!=NULL&&(p->data!=x))
{
p=p->next;
i++;
}
if(p!=NULL)
{
printf("\t\t在链表的第 %d 位找到 x = %c \n",i,x);
}
else printf("\t\t在该线性表中没有找到‘X’!\n");
//printf("请输入所要达到第几号功能:\t");
}
//插入一个元素,在链表中“某个元素”“之前”插入
void InsertList_befor()
{
char x;
//int y;
int i=0;
node *p,*s;
printf("请输入所要插入的第 i 位元素后 i=\t");
fflush(stdin);
scanf("%d",&i);
printf("请输入第 i 位后,所要插入的X的值X=\t");
fflush(stdin);
x=getchar();
p=FindList_number(i-1);
s=(node*)malloc(N);
s->data=x;
s->next=p->next;
p->next=s;
//y=s->data;
//s->data=p->data;
//p=s;
}
//求表长,求链表的长度函数
void LengthList()
{
int len=1;
node *p;
p=head->next;
while(p->next!=NULL)
{
p=p->next;
len++;
}
printf("该线性表的长度: len= %d \n",len);
}
//删除, 在该线性表链式结构中删除某个元素
void DeleteList()
{
node *p,*q;
char x;
printf("请输入所要删除的元素x: \t");
fflush(stdin);
scanf("%c",&x);
if(head==NULL)
{
printf("\t该链表的头指针为空!!!\n");
return;
}
if(head->next==NULL)
{
printf("\t该链表为空表!!!\n");
}
q=head;
p=head->next;
while((p!=NULL)&&(p->data!=x))
{
q=p;
p=p->next;
}
if(p!=NULL)
{
q->next=p->next;
free(p);
printf("\t\t线性表中的x= %c 已被删除\n",x);
}
else
printf("\t未找到所要删除的元素!!\n");
}
int main()// 显示菜单函数
{
char m;
while(1)
{
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)选项:\n");
printf("\n请输入所要达到第几号功能:\t");
fflush(stdin);
scanf("%c",&m);
if(m == '1')
InputList();
else if(m == '2')
InsertList_befor();
else if(m == '3')
DeleteList();
else if(m == '4')
ShowList();
else if(m == '5')
FindList();
else if(m == '6')
LengthList();
else if(m == '0')
return 0;
else{
printf("输入有误,请重新输入\n");
}
}
return 0;
}
--------------------------------我是萌萌哒的分割线-------------------------------------
第二组代码
#include<stdio.h>
#include<malloc.h>
typedef struct linknode // 结点类型定义
{
char data; // 数据域,数据类型为字符型
struct linknode *next; // next为指针域
}linknode;
linknode *head; // 定义 head 为结构类型指针变量
int n; //n为线性表的长度
//尾插法建表
// 带头结点的尾插法建立单链表
void createlist()
{
char x;
int z=1;
linknode *p,*s;
n=0; //线性表的长度刚开始为0
head=(linknode *)malloc(sizeof(linknode)); // 生成头结点
p=head; //尾指针初值指向头结点
printf("\n\t\t请逐个输入结点。以x位结束标记!\n");
while(z)
{
printf("\n\t\t请输入一个字符数据,并按回车:\n");
scanf("\n%c",&x);
if(x!='x') // ‘x’为输入结束符
{
s=(linknode *)malloc(sizeof(linknode)); // 生成新结点
n++; //表长加1
s->data=x;
p->next=s; // 新结点插入表尾
s->next=NULL;
p=s; // 尾指针 p 指向新的表尾
}
else
{
z=0; //遇x结束链表循环
}
}
}
//插入结点算法
void insertList(int i, char x) //i 的合法位置为:1<=i<=n
{
linknode *s,*p;
int j=0; //j用来计数
p=head;
printf("\t\t请输入要插的位置和数值<i x>,并按回车:\n");
scanf("\n%d %c",&i,&x);
if(i>0)
{
while(p!=NULL && j<i-1) //在结点范围内并且当j<i-1时循环执行
{
j++;
p=p->next; //后移指针
} //当j==i时循环结束
if(p!=NULL) //p还在结点范围内,肯定j==i,说明找到了
{
s=(linknode*)malloc(sizeof(linknode)); //生成新结点
s->data=x;
s->next=p->next;
p->next=s; //将新结点插在位置为i的结点p的后面
n++; //表的长度加1
printf("\n\t\t插入成功");
}else
{
printf("\n\t\t线性表为空或插入位置超界");
}
}else
{
printf("\n\t\t抱歉!插入位置错误,请重新插入!");
}
}
//删除数据域为x的结点元素
void deleteList(char x)
{
linknode *p,*q;
q=head;
p=head->next; //q指向第一个元素
printf("\n\t\t请输入要删除的数据元素:");
scanf("\t\t%c",&x);
while(p!=NULL && p->data!=x)
{
q=p;
p=p->next;
} //顺链查找,直到p->data==x循环终止
if (p!=NULL)
{
q->next=p->next; // 如果p还在范围内,肯定p->data==x
free(p);
n--; //表的长度减1
printf("\n\t\t删除成功,结点%c已经被删除!",x);
}
else
printf("\n\t\t抱歉!没有找到您要删除的结点\n");
}
//显示线性表
void showlist()
{
linknode *p=head;
printf("\n\t\t显示线性表的所有元素:\n\t\t");
while(p->next!=NULL) //链表不为空
{
printf("%5c",p->next->data);
p=p->next; //后移指针
}
if(head->next==NULL||p==NULL)
printf("\n\t\t链表为空");
}
//按序号查找
linknode *queryList1(linknode *head, int i)
// head接收已存在的链表的头指针
// i 接收要查找的结点的位置
//从头结点开始顺链扫描
{
linknode *p; //用指针 p 指向当前扫描到的结点。
int j=1; //用 j 作统计已扫描结点数的计数器,j 的初值为 1 。
p=head->next; //p 的初值指链表中的第一个元素.
printf("\n\t\t请输入要查找的结点的位置,并按回车:\n");
scanf("\n%d",&i);
while( p->next!=NULL && j<i )
{
p=p->next;
j++; //当 p 扫描下一个结点时,j 自动加 1
}
if(j==i) //当 j=i时,指针 p 所指的结点就是第 i 个结点
{
printf("\n\t\t查找的此结点所在位置的值为:%c",p->data);
}
else
{
printf("\n\t\t未找到此节点,请确认输入是否正确!!");
}
}
void lengthList()
{
linknode *p;
n=0;
p=head;
while(p->next!=NULL && p!=NULL)
{
n++; //表的长度加1
p=p->next; //后移指针
}
if(p->next==NULL) //如果到表尾
{
printf("\n\t\t线性表的长度为:%d",n);
}else
{
printf("\n\t\t链表不存在");
}
}
void main()
{ int choose,i,j=1;
char x;
head = NULL;
while(j)
{
printf("\n\t\t\t\t 线性表子系统");
printf("\n\t\t*************************************************");
printf("\n\t\t* \t 1------建 表 \t\t\t* ");
printf("\n\t\t* \t 2------插 入 \t\t\t* ");
printf("\n\t\t* \t 3------删 除 \t\t\t* ");
printf("\n\t\t* \t 4------显 示 \t\t\t* ");
printf("\n\t\t* \t 5------查 找 \t\t\t* ");
printf("\n\t\t* \t 6------求 表 长 \t\t* ");
printf("\n\t\t* \t 0------返 回 \t\t\t* ");
printf("\n\t\t*************************************************");
printf("\n\t\t请选择菜单号码(0-6):");
scanf("%d",&choose);
printf("\n");
if(choose==1)
{
createlist();
printf("\n\t\t\t\t 建表成功!!!\n");
}else if(choose==5)
{
queryList1(head, i);
//queryList2(head, x);
}else if(choose==2)
{
insertList(i, x);
}else if(choose==3)
{
//deleteList(i);
deleteList(x);
}else if(choose==4)
{
if(head==NULL)
{
printf("\n\t\t抱歉!线性表为空,请先建表!");
}else
{
showlist();
}
}else if(choose==6)
{
lengthList();
}else if(choose==0)
{
j=0;
}else
{
printf("输入错误,请重新输入!");
}
}
}
-----------------------------我依旧是萌萌哒的分割线----------------------------------
以上内容纯属转载,第一组代码原文详见2puT博客http://blog.csdn.net/lina_acm/article/details/51162501
第二组代码详见博客园竹立荷塘http://www.cnblogs.com/daipianpian/p/4514266.html
- 数据结构用c实现线性表子系统
- 数据结构(线性表子系统:c实现)
- 数据结构--线性表C实现
- 线性表数据结构C语言实现
- 数据结构_1:线性表: C语言实现
- C - 数据结构 - 线性表 - 链式实现
- 【C语言 数据结构】 简单线性表实现
- C语言实现数据结构--线性表
- C语言数据结构-线性表-双链表实现
- 【数据结构】数据结构C语言的实现(线性表)
- 数据结构(循环队列子系统:c实现)
- 数据结构(栈子系统:c实现)
- 数据结构-线性表 (C++)
- 数据结构线性表c
- C - 数据结构 - 线性表
- 数据结构 C语言实现 线性表的链式实现
- 数据结构之---c语言实现线性表的顺序表
- 数据结构--线性表.顺序表(C语言实现)
- semi-sync插件崩溃导致MySQL重启故障详析
- 利用神经网络识别窃电用户
- 大公司知名开源小组及项目介绍
- JeeSite相关技术摘点(二)
- MySQL Server has gone away报错原因汇总版
- 数据结构用c实现线性表子系统
- StrToInt 和 IntToStr
- AndroidStudio项目结构
- 第一章、Sql server 中的对象
- Linux下的tar压缩解压缩命令详解
- 步进电机麦轮小车程序编写
- 数据结构实验之栈与队列八:栈的基本操作
- vue mint-ui 使用手册
- 学生选课系统库表设计