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

#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;
}

你可能感兴趣的:(数据结构(线性表子系统:c实现))