本文已参与「新人创作礼」活动,一起开启掘金创作之路
题目
建立单链表存储数据(10,20,30,40,50,60,70,80,90,100),要求:(1)头插法或尾插法建立单链表,并输出单链表中所有元素;(2)输出单链表中的最大值和最小值;(3)键盘输入一个值x,输出链表中第一个值为x的元素的位序;(4)键盘输入一位序值b,在第b个元素之前插入值为500的元素,输出链表中的所有数据;(5)键盘输入位序值m,删除位序为m的元素,输出链表中的所有数据;(6)输出单链表的长度。
#include <stdio.h>
#include <malloc.h>
//定义表结构
typedef struct Node{
int data;
struct Node *next;
}Sqlist;
//初始化
void initlist(Sqlist *&L) {
L = (Sqlist *)malloc(sizeof(Sqlist));//建立头结点
L->next = NULL;
}
//尾插法
void CreateList(Sqlist *&L,int a[],int n){
Sqlist *s,*r;
r = L;//r始终指向尾结点
for( int i=0;i<n;i++){
s = (Sqlist*)malloc(sizeof(Sqlist));//建立新节点s
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
//输出单链表
void Showlist(Sqlist *L){
Sqlist *p=L->next;
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
//查找最大值最小值
void FMaxMin(Sqlist *L) {
Sqlist *p = L->next;
int max = p->data,min = p->data;
while(p!=NULL){
if(p->data>max){
max=p->data;
}
if(p->data<min){
min=p->data;
}
p=p->next;
}
printf("表中的最大值为%d\n",max);
printf("表中的最小值为%d\n",min);
printf("\n");
}
//查找值为x的位序
int Findlist(Sqlist *L,int e){
Sqlist *p = L->next;
int i = 1;
while(p!=NULL && p->data!=e){
p = p->next;
i++;
}
if(p==NULL)
return (0);
else
return (i);
}
//在第b个元素后插入值x
bool Insertlist(Sqlist *&L,int i,int e){
if(i<=0){
return false;
}
Sqlist *s,*p=L;
int j=0;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
s=(Sqlist*)malloc(sizeof(Sqlist));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
//删除第m个元素
bool Deletelist(Sqlist *&L,int m){
if(m<0){
return false;
}
Sqlist *q,*p=L;
int j=0;
while(j<m-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
q=p->next;
if(q==NULL){
return false;
}
p->next=q->next;
free(q);
return true;
}
}
//单链表的长度
int Lengthlist(Sqlist *L){
int n=0;
Sqlist *p=L;
while(p!=NULL){
n++;
p=p->next;
}
return n;
}
void menu()
{
printf("①头插法或尾插法创建单链表,并输出单链表中全部元素\n");
printf("②输出单链表中的最大值和最小值\n");
printf("③键盘输入一个值x,输出链表中第一个值为x的元素的位序\n");
printf("④键盘输入一位序值b,在第b个元素以前插入值为500的元素,输出链表中的全部数据\n");
printf("⑤键盘输入位序值m,删除位序为m的元素,输出链表中的全部数据\n");
printf("⑥输出单链表的长度\n");
printf("0 召唤菜单\n");
}
int main()
{
Sqlist *h;
int n=10,e,i;
int a[10]={10,20,30,40,50,60,70,80,90,100};
initlist(h);
CreateList(h,a,n);
menu();
int flag=9;
while(1)
{
printf("输入您要作的题目:");
scanf("%d",&flag);
switch(flag)
{
case 1:Showlist(h);break;
case 2:FMaxMin(h);break;
case 3:
printf("您要查找的数据:\n");
scanf("%d",&e);
if(Findlist(h,e)==0)
printf("没有找到您要查找的数据\n");
else
printf("%d的在表中的位置是第%d\n",e,Findlist(h,e));
break;
case 4:
printf("您要插入第几位数据:");
scanf("%d",&i);
printf("您要输入的数据:");
scanf("%d",&e);
Insertlist(h, i, e);
printf("插入后数据为:\n");
Showlist(h);
break;
case 5:
printf("您要删除第几位数据:");
scanf("%d",&i);
Deletelist(h, i);
printf("删除后数据为:\n");
Showlist(h);
break;
case 6:
printf("表有%d个数据\n:",Lengthlist(h));
break;
case 0:menu();break;
}
}
return 0;
}
作者:老6
qq:664474618
一起学习,一起进步!