回复 3楼 下个路口再见
我以前做了一个,工程量很大的,诶,现在感觉以前写的不咋专业,不过凑合看看还是可以的~试试看
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Studnet)
void creat();
void print();
void Insert();
void Del();
void Menu();
struct Studnet
{
int num;
int score;
struct Studnet *next;
}*head=NULL,*Mark_head;
int n=0;
void Menu()
{
printf("菜单:\n输入1创建/加长链表\n");
printf("输入2插入链表\n");
printf("输入3删除链表\n");
printf("输入4输出链表\n");
printf("输入0退出\n");
}
void creat()
{
struct Studnet *p1,*p2;
if (n==0)
{
printf("请输入学生的成绩和学号(按0退出)\n");
Mark_head=p1=p2=(struct Studnet *)malloc(LEN);
head=p1;
printf("%d--",n+1);
scanf("%d%d",&p1->num,&p1->score);
}
else
{
p1=head;
while (p1->next)
p1=p1->next;//这个循环构造是把结构体指针p1移向尾部
p2=p1;
n--;
}
while (p1->num)
{
n++;
p2->next=p1;
p2=p1;
p1=(struct Studnet *)malloc(LEN);
printf("%d--",n+1);
scanf("%d%d",&p1->num,&p1->score);
}
p2->next=NULL;
}
void print()
{
struct Studnet *p=head;
int i=1;
if (n==0)
{
printf("该表为空表,返回菜单\n");
return;
}
while (p)
{
printf("%d--",i++);
printf("%4d %4d\n",p->num,p->score);
p=p->next;
}
printf("\n");
}
void Insert()//插入链表
{
int point,i;
struct Studnet *p1=head;
struct Studnet *p2,*pt=NULL;
if (n==0)
{
printf("该表为空表\n");
return;
}
while (n)
{
i=1;
p1=p2=head; //初始化
printf("插入节点:请输入学生的学号和成绩(学号输入0返回菜单,输入-1查询链表情况)\n");
p2=(struct Studnet *)malloc(LEN);
printf("%d--",n+1);
if (scanf("%d%d",&p2->num,&p2->score)&&p2->num==0)
return;
else if (p2->num==-1)
{
printf("链表数据如下:\n");
print();
printf("\n请重新输入数据(学号输入0返回菜单)\n");
printf("%d--",n+1);
if (scanf("%d%d",&p2->num,&p2->score)&&p2->num==0)
return;
}
printf("请选择你要插入的节点位置(现在共有%d个节点,按0返回菜单)\n",n);
while (scanf("%d",&point)&&(point>n||point<1)&&point!=0)
printf("找不到该节点\n");
if (point==0)
return;
while (1)
{
if (point==1)//插入节点在头部
{
p2->next=p1;
head=p2;
Mark_head=p2;
n++;
printf("插入成功\n");
break;
}
else if (point==n)//插入节点在尾部
{
while (p1->next)
p1=p1->next;
p1->next=p2;
p2->next=NULL;
n++;
printf("插入成功\n");
break;
}
if (point!=i+1)
{
p1=p1->next;
i++;
}
else //插入节点在中间
{
pt=p1->next;
p1->next=p2;
p2->next=pt;
n++;
printf("插入成功\n");
break;
}
}
}
printf("该表为空表\n");
}
void Del()//删除节点
{
struct Studnet *p1,*p2,*pt;
int point,i;
if (n==0)
{
printf("该表为空表\n");
return;
}
while (1)
{
i=1;
p1=p2=head;//初始化
printf("请选择要删除的节点(现在共有%d个节点,按0返回菜单,按-1输出链表)\n",n);
while (scanf("%d",&point)&&(point<0||point>n)&&point!=0)
{
if (point==-1)
{
print();
Del();
}
if (n==0)
return;
printf("找不到该节点\n");
}
if (point==0)
return;
while (1)
{
if (point==1&&n!=1)//删除节点在头部
{
head=head->next;
p1=head;
free(Mark_head);
Mark_head=p1;
n--;
printf("已成功删除节点\n");
break;
}
if (point==n&&n!=1)//删除节点在尾部
{
while (p1->next)
{
p2=p1;
p1=p1->next;
}
free(p1);
p2->next=NULL;
printf("已成功删除节点\n");
n--;
break;
}
if (n==1)//当链表只有一个节点的时候
{
free(Mark_head);
n--;
printf("已成功删除节点--现在链表为空表\n");
return;
}
if (point!=i)//删除节点在中间
{
if (i!=1)
p2=p2->next;
p1=p1->next;
i++;
}
else //找到删除的节点
{
pt=p2->next;
p1=p1->next;
p2->next=p1;
free(pt);
n--;
printf("已成功删除节点\n");
break;
}
}
}
}
int main()
{
short choice;
Menu();
while (scanf("%d",&choice)&&choice)
{
fflush(stdin);
system("cls");
switch (choice)
{
case 1:creat();break;
case 2:Insert();break;
case 3:Del();break;
case 4:print();break;
}
if (choice)
Menu();
}
return 0;
}