您的位置:首页 > 理论基础 > 数据结构算法

数据结构(线性表子系统:c实现)

2016-04-15 16:09 471 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: