📄 linklistb.c
字号:
/* linklistb.c */
#include"linklist.c"/*调用单链表的建立和输出子程序文件*/
LinkList Get_LinkList(LinkList H, int k)
{/*在单链表中按序号查找第 k 个数据元素,找到返回其指针,否则返回空*/
LNode *p=H;
int j=0;
while (p->next!=NULL && j<k )
{ p=p->next; j++; }
if (j==k&&j!=0) return p ;
else return NULL;
}/*Get_LinkList*/
Status Insert_LinkList(LinkList H,int i,ElemType x)
{ /* 在单链表H的第i个位置上插入值为x的元素 */
LNode * p,*s;
p=Get_LinkList(H,i-1); /* 查找第i-1个结点 */
if (p==NULL)
return ERROR; /* 第i-1个结点不存在,不能插入 */
else {
s=(LinkList)malloc(sizeof(LNode)); /* 申请、填装结点 */
s->data=x;
s->next=p->next; /* 新结点插入在第i-1个结点的后面 */
p->next=s;
return OK;}
}/* Insert_LinkList */
Status Delete_LinkList(LinkList H,int i) /* 删除表序号为i的记录 */
{LNode *q,*p;
int j=1;
q=H;p=H->next;
while(p&&j<i)
{q=p;p=p->next;++j;}
if(i>j) return ERROR; /* 输入的序号非法 */
q->next=p->next;
free(p); /* 释放空间 */
return OK;
}/* Delete_LinkList */
void del_linkx(LinkList H,float x) /* 删除所有成绩域为x的结点*/
{
LNode *p,*q; int i=0;
p=H; q=H->next;
while(q!=NULL)
{
if(q->Score<x) {
p->next=q->next; free(q); q =p->next; i++;
}
else { p=q; q=q->next;}
}
printf("第%d个学生信息被删除了! \n",i);
}
void Reverse_L(LinkList H) /*单链表的逆置*/
{ LNode *p,*q,*s;
p=H->next;
if (p)
{ /*非空表*/
q=p->next;
if (q) /*表长大于等于2*/
{ if (q->next) /*表长大于2*/
{s=q->next; p->next=NULL;
while(s->next)
{
q->next=p;p=q;
q=s;s=s->next; /* 把H的元素逐个插入新表表头 */
}/*while*/
q->next=p;s->next=q;H->next=s;
}/*if (q->next) */
else /*表长等于2*/
{q->next=p;H->next=q;}
} }
}/* Reverse_L*/
void main()
{int j=1,Num,kk; float score;
LNode *H,*q; ElemType x;
H=Creat_LinkList();
Print_LinkList(H);
while (j) /*功能菜单*/
{printf("输入0到5的整数选择一个操作:\n");
printf("1: 查找\n");
printf("2: 插入\n");
printf("3: 删除指定编号的节点\n");
printf("4: 删除成绩等于指定值的学生信息\n"); /*删除所有成绩域为x的结点*/
printf("5: 逆置\n");
printf("0: 退出程序\n");
scanf("%d",&j);
switch(j)
{case 0: printf("退出程序!\n");exit(0);
case 1: printf("请输入查找位置\n");
scanf("%d",&i);
q=Get_LinkList(H,i);
if (q)
{ printf("查找成功!该学生的信息如下:\n");
printf("num=%d,name=%s,score=%f\n",q->data.Num,q->data.Name,q->
data.Score);}
else printf("查找失败! \n");
break;
case 2:
/*首先输入插入位置和待插入的学生信息*/
printf("请输入一个学生的信息:Num,Name,Score :\n");
scanf("%d",&num);
getchar();gets(ss);
scanf("%f",&score);
x.Num=num;
strcpy(x.Name,ss);
x.Score=score;
printf("请输入插入位置\n");
scanf("%d",&i);
kk=Insert_LinkList(H,i,x);
if(!kk)
printf("\n输入的位置无效!\n");
else
Print_LinkList(H);break;
case 3: printf("请输入删除位置(整数)\n");
scanf("%d",&i);
kk=Delete_LinkList(H,i);
if(!kk)
printf("\n输入的删除位置无效!\n");
else
Print_LinkList(H);break;
case 4: printf("按成绩删除,请输入这个成绩:\n");
scanf("%f",&score); /*删除所有成绩域为x的结点*/
del_linkx(H,score);
Print_LinkList(H);break;
case 5:
Reverse_L(H);
printf("逆置结果为:\n");
Print_LinkList(H);break;
default: printf("输入无效!请重新输入!\n"); }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -