【无标题】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


请求

俺是俺是你们的学长,点点关注点点赞就可以了,制作不容易,非常感谢!!!!
有问题,私信,评论都可以,我在学校每天晚上都会回复你们,一起加油

前言

线性表子系统,包括两个模块链式储存结构以及线性储存结构,我将一一的列举出代码以及注解,喜欢的点击关注三连,我是你们的学长

一、实验目的

实验目的:
1.掌握线性表的特点。
2.掌握线性表顺序存储结构和链式存储结构的基本运算。
3.掌握线性表的穿件、插入、删除和显示线性表中元素等基本操作。

二、实验步骤

1.线性存储结构

采用顺序存储结构,完成以下操作
1.建立线性表,保存表元素{A,B,C,D,F,E}
2.插入表元素;
3.删除表元素;
4.查找表元素;
5.求表长;
6.显示表元素;
上述操作以下菜单交互操作。

详细思路

1,建表思路

调用Greatlist函数建立表头完成顺序表的初始化,同时将需要输入的数据通过调用BuildList函数将数据存入到已经规划好空间的数组中
通过以下操作完成数据的插入
for (i = 0;;i++)//简历循环
{
Printf(“输入数据:“);
scanf (“%c”,&L->data[i]);//将数据输入存储的数组中
getchar ();//缓冲
if (L->data[i] == ‘0’)//判断停止的条件
break;//跳出循环
L->last++; //最后指向的节点数加一
}

2,插入数据

首先判断存入的数据是否已经填满了静态数组,将节点指向的最后位置与定义的静态存储空间大小相比较,判断是否可以插入,同时根据插入的位置判断是否合理
将插入位置后面的数组元素集体往后移动一个量级,将需要插入的数据填入,,将指向的最后一个节点加一
for (j = L->last+1;j > i-1;j–)
L->data[j] = L->data[j-1];//表格后移动
L->data[i-1] = d;//插入数据
L->last++;//将线性表的最大储存值加一
printf (“插入成功!\n”);
return 1;

3,显示数据

将建立的线性表通过指针挨个输出,调用PrintfList函数输出
printf (“\n表中的数据为:\n”);
for (i = 0;i <= L->last;i++)
printf (“%c “,L->data[i]);
printf (”\n”);

4 ,删除数据

删除数据按它在线性表中的位置进行删除,首先判断它是否删除位置合理,合理的话便将其所在位置下一个数据移动至上一个元素中,往依次类推,直至到达最后一个数据所在的位置
for (j = i;j <= L->last;j++)
L->data[j-1] = L->data[j];
L->last–;
printf (“删除成功!\n”);

5,查找数据

按数值查找,输入要查找的数值开始从头结点开始查找,判断是否是已经存入的数据,若遍历数组完成还是没找到数据怎返回-1最后通过主函数输出未找到
找到的数据输出其所在的位置

6求表长

通过判断最后的指向数组值在加一就可以确定表的长度

代码如下(示例):

#define MAXSIZE 100
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct
{
	datatype data[MAXSIZE];
	int last;
}SeqList;

void Menu ();		//显示菜单 
SeqList *CreatList (); 		//初始化顺序表
void BuildList (SeqList *L);		//将元素保存到表中 
int InsList (SeqList *L,int i,datatype d);		//插入表元素 
int DeleteList (SeqList *L,int i);		//删除表元素 
void PrintList (SeqList *L);		//输出表内容 
int SearchList (SeqList *L,char d);		//查找表元素 
int LengthList (SeqList *L);		//求顺序表的当前长度 

int main ()
{
	SeqList *L;		//L表示顺序表的首地址
	int i,input,result;		//i表示插入的位置,input为输入的选择,result表示返回的值 
	int control = 1;		//控制是否退出程序 
	char d;		//d表示将插入的元素 

	while (control)
	{
		system ("cls");		//清屏 
		Menu (); 
		printf ("\t\t请输入你的选择:");
		scanf ("%d",&input);
		getchar ();		//缓冲回车 
		
		switch (input)
		{
			case 1:
				L = CreatList ();
				BuildList (L);
				break;
			case 2:
				printf ("\n输入插入元素的位置:"); 
				scanf ("%d",&i);
				getchar ();
				printf ("输入插入元素的值:");
				scanf ("%c",&d);
				InsList (L,i,d);
				break;
			case 3:
				printf ("\n请输入删除元素的位置:");
				scanf ("%d",&i);
				DeleteList (L,i);
				break;
			case 4:
				PrintList (L);
				printf ("\n");
				break;
			case 5:
				printf ("\n请输入要寻找的数据:");
				scanf ("%c",&d);
				result = SearchList (L,d);
				if (result == -1)
					printf ("未找到该元素!\n");
				else
					printf ("该元素的位置为%d\n",result+1); 
				break;
			case 6:
				printf ("\n当前表的长度为:%d\n",LengthList(L)+1);
				break;
			case 7:
				control = 0;
				break;
			default:
				printf ("\n输入的选项有误,请重新输入!\n");
				break; 
		}
		if (input != 7)
			system ("pause");		//程序暂停 
	}
	
	return 0;
}

void Menu ()
{
	printf ("\n\n\t\t____________________________________________\n");
	printf ("\t\t|             线性表子系统                 |\n");
	printf ("\t\t^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n");
	printf ("\t\t|            1----建    表                 |\n");
	printf ("\t\t|            2----插    入                 |\n");
	printf ("\t\t|            3----删    除                 |\n");
	printf ("\t\t|            4----显    示                 |\n");
	printf ("\t\t|            5----查    找                 |\n");
	printf ("\t\t|            6----求 表 长                 |\n");
	printf ("\t\t|            7----返    回                 |\n");
	printf ("\t\t********************************************\n");
}

SeqList *CreatList ()
{
	SeqList *L;
	
	L = (SeqList *)malloc (sizeof (SeqList));
	L->last = -1;
	
	return L;
}

void BuildList (SeqList *L)
{
	int i;
	
	printf ("\n(输入数据为0时结束输入)\n");
	for (i = 0;;i++)
	{
		printf ("输入数据:");
		scanf ("%c",&L->data[i]);
		getchar ();
		if (L->data[i] == '0')
			break;
		L->last++;	
	}
	printf ("\n创建成功!\n");
}

int InsList (SeqList *L,int i,datatype d)
{
	int j;
	
	if (L->last == MAXSIZE-1)
	{
		printf ("顺序表已满!\n");
		return -1;
	}
	
	if (i < 1 || i > L->last+1)
	{
		printf ("位置出错!\n");
		return 0;
	}
	
	for (j = L->last+1;j > i-1;j--)
		L->data[j] = L->data[j-1];
	
	L->data[i-1] = d;
	L->last++;
	printf ("插入成功!\n");
	return 1;
}

int DeleteList (SeqList *L,int i)
{
	int j;
	if (i < 1 || i > L->last+1)
	{
		printf ("位置出错!\n");
		return 0;
	}
	
	for (j = i;j <= L->last;j++)
		L->data[j-1] = L->data[j];
	L->last--;
	printf ("删除成功!\n");
	return 1;
}

void PrintList (SeqList *L)
{
	int i;
	
	printf ("\n表中的数据为:\n");
	for (i = 0;i <= L->last;i++)
		printf ("%c  ",L->data[i]);
	printf ("\n");
}

int SearchList (SeqList *L,char d)
{
	int i = 0;
	
	while (i <= L->last && L->data[i] != d)
		i++;
	if (i > L->last)
		return -1;
	else
		return i;
} 

int LengthList (SeqList *L)
{
	return L->last; 
} 

2.链式存储结构

详细思路

1,建立链表

通过调用CreateList函数还建立链表,采用头插法来建立链表,
同时初始化初链表

2,插入数据

首先判断存入的数据是否已经填满了静态数组,将节点指向的最后位置与定义的静态存储空间大小相比较,判断是否可以插入,同时根据插入的位置判断是否合理
通过确定出入的位置,将线性表的位置确定,通过位置插入法,将得到的数据插入到线性表中

3,显示

调用线性表通过指针挨个输出,调用PrintfList函数输出

4,删除

删除数据按它在线性表中的位置进行删除,首先判断它是否删除位置合理,合理的话便将其所在位置下一个数据移动至上一个元素中,往依次类推,直至到达最后一个数据所在的位置

5,求表长

通过判断最后的指向数组值在加一就可以确定表的长度
完整代码如下(示例):

#include<stdio.h>
#include<malloc.h>
typedef struct linknode
{
char data;
struct linknode *next;
}linnode;
linnode *head;
int n;

void CreateList()
{
      linnode *p, *s;
      int z;
      char x;
      n=0;
      z=1;
      head=(linnode *)malloc(sizeof(linnode)) ; 
      p=head;
      printf("\n\t\t请逐个输入节点,以'x'为结束标记!\n");
	  printf("\n");
      while(z)
	  {
		printf("\t\t输入一个字符数据,并按回车: ");
		scanf("%c", &x); 
		getchar();
		if(x!='x')
		 {
			s= (linnode *)malloc(sizeof(linnode));
			n++;
			s->data=x;
			p->next=s;
			s->next=NULL;
			p=s;
		}
		 else z=0;
	 }
}

void InsList(int i,char x)
{
      linnode *s, *p;
	  int j;
      p=head;
      j=0;
      while (p!=NULL&&j<i)
	  {
         j++;
	     p=p->next;
	  }
      if(p!=NULL)
	  {
         s=(linnode *)malloc(sizeof(linnode));
         s->data=x;
         s->next=p->next;
         p->next=s;
         n++;
	  }
      else printf("\n\t\t线性表为空或插入位置超出!\n");
}
void DelList(char x)
{
      linnode *p,*q;
      if (head==NULL)
	  {
		printf("\n\t\t链表下溢!");
		return;
	  }
      if(head->next==NULL)
	  {
		printf("\n\t\t线性表已空!");
		return;
	  }
      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);
		n--;
		printf("\n\t\t结点%c 已经被删除!",x);
	  }
      else printf("\n\t\t抱歉!没有找到您要删除的结点.");
}

void ShowList()
{
      linnode *p=head;
      printf("\n\t\t显示线性表的所有元素:");
	  if(head->next==NULL||p==NULL)
         printf("\n\t\t链表为空! ");
      else
	  {
		 printf("\n\t\t");
		 while (p->next!=NULL)
		 {
			 printf("%5c",p->next->data);
			p=p->next;
		 }
	  }
}

void SearchList(char x)
{
    linnode *p;
    int i=1;
    if (head==NULL)
	{
		 printf("\n\t\t链表下溢!");
		 return;
	}
    if (head->next==NULL)
	{
		printf("\n\t\t线性表为空,没有任何结点!");
		return;
	}
    p=head->next;
    while(p!=NULL&&p->data!=x)
	{
      p=p->next;
      i++;
	}
    if(p!=NULL) 
      printf("\n\t\t在表的第%d位上找到值为%c的结点!",i,x);
    else
      printf("\n\t\t抱歉!未找到值为%c的结点!",x);
}

int main()
{
	int choice,i,j;
    char x;
	head=NULL;
	j=1;
	while(j)
	{ 
		printf("\n");
        printf("\n\t\t****************************");
        printf("\n\t\t*       线性表子系统       *");
        printf("\n\t\t****************************");
	    printf("\n\t\t*       1-----建  表       *");
	    printf("\n\t\t*       2-----插  入       *");
	    printf("\n\t\t*       3-----刪  除       *");
	    printf("\n\t\t*       4-----显  示       *");
	    printf("\n\t\t*       5-----査  找       *");
	    printf("\n\t\t*       6-----求表长       *");
	    printf("\n\t\t*       0-----返  回       *");
        printf("\n\t\t****************************");
	    printf("\n\t\t 请选择菜単号 (0--6):   ");
	    scanf("%d",&choice);
        getchar();
	    if(choice==1)
			CreateList();
		else
			if(choice==2)
			{
				printf("\n\t\t请输入插入的位置i和插入的数据(输入格式:i,x)");
			    scanf("%d,%c",&i,&x);
		        InsList(i,x);
			}
			else
				if(choice==3)
				{
					printf("\n\t\t请输入要刪除的数值:");
		            scanf("%c",&x);
                    DelList(x);
				}
				else
                	if(choice==4)
					{
						if(head==NULL)
							printf("\n\t\t请先建立线性表!");
						else
                        ShowList();
					}
					else
						if(choice==5)
						{ 
							printf("\n\t\t请输入要查找的元素:");
							scanf("%c",&x);
							SearchList(x);
						}
						else
							if(choice==6)
								printf("\n\t\t线性表长度为: %d",n);
							else
								if(choice==0)
									j=0;
								else
									printf("\n\t\t输入错误!请重新输入!");
	}
}

C语言代码

总结

提示:建议结合数据结构课本一起学习

俺是你们的学长,点点关注就可以了,制作不容易,非常感谢!!!!!

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值