[专题]c语言 建立 输出 插入 删除 修改功能的单项动态链表
C语言链表类题目
写函数一个有三名学生数据的, 有建立 输出 插入 删除 修改功能的单项动态链表,很全
面,各种测试都试过了,环境VC6.0 结构体为学号 成绩
#include #include #include
struct Student
{
long num;
float score;
struct Student* next;
struct Student *pre; };
int n=0;
struct Student* create(void)
{
struct Student *head;
struct Student *tail;
struct Student *pre;
struct Student *p;
head = NULL;
pre = NULL;
p=(struct Student*)malloc(sizeof(struct Student));
printf("请输入用户名和得分:\n");
scanf("%ld %f",&p->num,&p->score);
if (0 == p->num)
{
return NULL;
}
while(0 != p->num)
{
n++;
if (NULL == head)
{
head=p;
tail=p;
pre = NULL;
tail->next = NULL;
}
else
{
pre = tail;
tail->next=p;
tail=p;
}
p=(struct Student*)malloc(sizeof(struct Student));
printf("请输入用户名和得分:\n");
scanf("%ld%f",&p->num,&p->score);
}
if (NULL != pre)
{
tail->next=NULL;
}
return head;
}
void print(struct Student *head)
{
struct Student *p=head;
if (NULL == p)
{
printf("该链表中还没有数据\n");
}
while (p !=NULL)
{
printf("%ld\t%.3f\n",p->num,p->score);
p=p->next;
}
}
struct Student *del(struct Student *head, long num) {
struct Student *p1 = head;
struct Student *p2 = head;
if (NULL == head)
{
return NULL;
}
if (NULL == head->next)
{
if (num == head->num)
{
n--;
return NULL;
}
else
{
return head;
}
}
if (num == head->num)
{
n--;
head=head->next;
return head;
}
if (NULL == head->next->next)
{
if (num == head->next->num)
{
n--;
head->next = NULL;
return head;
}
}
p1 = head->next;
while (p1!=NULL)
{
if (num == p1->num)
{
n--;
if (NULL == p1->next)
{
p2->next = NULL;
}
else
{
p2->next = p1->next;
}
}
p1 = p1->next;
p2 = p2->next;
}
return head;
}
struct Student *alter(struct Student *head, long num, float score)
{
struct Student *p = head;
while (p!=NULL)
{
if (num == p->num)
{
p->score = score;
}
p = p->next;
}
return head;
}
struct Student *insert(struct Student *head, long num, float score)
{
struct Student *p1=head;
struct Student *p2=head;
struct Student *p;
p=(struct Student*)malloc(sizeof(struct Student));
p->num = num;
p->score = score;
if (NULL == head)
{
head = p;
head->next = NULL;
return head;
}
if (NULL == head->next)
{
if (num >= head->num)
{
head->next = p;
p->next =NULL;
return head;
}
else
{
p->next = head;
head = p;
return head;
}
}
if (num < head->num)
{
p->next = head;
head = p;
return head;
}
p1=head->next;
while (p1!=NULL)
{
if (num >= p2->num)
{
if (num <= p1->num)
{
p->next = p1;
->next = p; p2
}
else
{
if (NULL == p1->next)
{
p1->next = p;
p->next = NULL;
}
}
}
p1 = p1->next;
p2 = p2->next;
}
return head;
}
int main()
{
struct Student *head = create();
long num_del;
long num_insert;
float score_insert;
long num_alter;
float score_alter;
printf("\n\n\n");
printf("以下为输出结果:\n\n");
print(head);
printf("\n");
printf("共有节点%d个\n",n);
printf("\n");
printf("下面开始删除节点\n");
printf("请输入要删除的节点号码: ");
scanf("%ld",&num_del);
head = del(head,num_del);
printf("以下为输出结果:\n\n");
print(head);
printf("\n");
printf("共有节点%d个\n",n);
printf("下面开始插入节点\n");
printf("请输入要插入的节点号码和得分: ");
scanf("%ld %f",&num_insert,&score_insert);
head = insert(head,num_insert,score_insert);
printf("以下为输出结果:\n\n");
print(head);
printf("\n");
printf("共有节点%d个\n",n+1);
printf("下面开始修改节点\n");
printf("请输入要修改的节点号码和要改成的得分: ");
scanf("%ld %f",&num_alter,&score_alter);
head = alter(head,num_alter,score_alter);
printf("以下为输出结果:\n\n");
print(head);
printf("\n");
printf("共有节点%d个\n",n+1);
printf("\n");
printf("\n");
return 0;