32.链表的综合运用

编写一个程序,实现单向链表的建立与输出、结点的插入与删除,每个结点包括:学号、姓名、性别、年龄。






#include<stdio.h>
#include<stdlib.h>
typedef struct student 
{
int number;
char name[30];
char gender[10];
int age;
struct student *next;
}infor;
//--------------------------------功能变量----------------------------------
int n = 0;
infor *head;
infor *p1, *p2;
infor *list;
infor *list2;
//--------------------------------功能函数----------------------------------
infor *set_up_list();
infor *printf_out_list();
infor *reminder();
infor *add_to_list();
infor *add_to_first();
infor *search_list(infor *list, int number);//按学号查找
infor *delete_list(infor*list);


int main()
{
set_up_list();
//--------------------------建立完毕---------------------------------------------------------
printf("链表建立已完成,是否输出检验?\n");
printf("是,请输入1;否请输入0\n");
int judge = 0;
scanf("%d", &judge);
if (judge)
{
printf_out_list();
}
//---------------------------输出完毕-------------------------------------------------------------
printf("首端插入请输入1\n中间输入输入0\n");
reminder(1);//链接插入函数
//-----------------------------插入完毕------------------------------------------
delete_list(head);

printf("谢谢使用,再见\n");
return 0;
}
//-----------------------建立链表----------------------------------------
infor *set_up_list()
{
p1 = p2 = (infor *)malloc(100);
printf("下面开始建立链表,请以此输入学生的学号,姓名,性别和年龄。\n以学号输入0为终止\n");
scanf("%d", &p1->number);
getchar();
scanf("%s", p1->name);
getchar();
scanf("%s %d", p1->gender, &p1->age);
head = NULL;
while (p1->number != 0)
{
n++;
if (n == 1) head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (infor *)malloc(100);
scanf("%d", &p1->number);
if (p1->number == 0)break;
getchar();
scanf("%s", p1->name);
getchar();
scanf("%s %d", p1->gender, &p1->age);
}
p2->next = NULL;
}
//-----------------------输出链表----------------------------------------
infor *printf_out_list()
{
printf("下面开始输出链表:\n");
printf("学号     姓名             性别  年龄  \n");
for (infor *list = head; list != NULL; list = list->next)
{
printf("%d    %s    %s   %d\n", list->number, list->name, list->gender, list->age);
}
printf("输出完毕\n");
}
//-----------------------搜索链表----------------------------------------
infor *search_list(infor *list, int number)//按学号查找
{
for (;list!=NULL;list=list->next)
{
if (list->number == number)
return list;
}
return NULL;
}
//------------------------------提示函数-----------------------------------------------------------
infor *reminder()
{

return NULL;
printf("需要进行操作请按提示\n插入节点请输入1\n删除结点请输入2\n输出链表请输入3\n结束请按0\n");
int xh = 0;
scanf("%d", &xh);
if (xh == 0)
{
printf("\n\n谢谢使用,再见!!\n\n");
return 0;
}
if (xh == 1)
{
    int shou = 0;
scanf("%d", &shou);
if (shou)
{
add_to_first();
}
else
{
add_to_list();
}
}
if (xh == 2)
{
delete_list(head);
}
if (xh == 3)
{
printf_out_list();
}
}
//------------------------------插入首端-----------------------------------------------------------
infor *add_to_first()
{
infor *first=malloc(sizeof(infor));
first->next = head;
head = first;
printf("新的结点建立成功,请输入学生信息\n");
scanf("%d", &first->number);
getchar();
scanf("%s", first->name);
getchar();
scanf("%s %d", first->gender, &first->age);
printf("插入首端完毕\n");
return first;
}
//------------------------------插入节点----------------------------------------------------------
infor *add_to_list()
{
printf("下面开始添加结点,请输入所加结点前一个结点的学号\n");
for (int i = 0; i = 1;)
{
int stun = 0;
scanf("%d", &stun);
list = search_list(head, stun);
if (list != NULL)
{
printf("找到结点\n");
i = 1;
break;
}
else printf("未找到结点,请再次输入\n");
}
infor *new_node;
infor *new_node2;
new_node = malloc(sizeof(infor));
if (new_node == NULL)
{
printf("创建新节点失败\n");
return NULL;
}
new_node2 = list->next;
list->next= new_node;
new_node->next = new_node2;
printf("新的结点建立成功,请输入学生信息\n");
scanf("%d", &new_node->number);
getchar();
scanf("%s", new_node->name);
getchar();
scanf("%s %d", new_node->gender, &new_node->age);
printf("插入结点完毕\n");
return new_node;
}
//---------------------------删除结点------------------------------------------
infor *delete_list(infor*list)
{
printf("下面开始删除结点\n");
infor*cur;
infor*pre;
loop:printf("请输入所要删除的结点的学生学号\n");
int n = 0;
scanf("%d", &n);
for (cur = list, pre = NULL; cur != NULL; pre = cur, cur = cur->next)
{


if (cur->number == n)
{
break;           
}




}
if (cur == NULL)
{
printf("没有找到该学生结点\n是否重新输入\n是,请输入1,否,请输入0\n");
int j = 0;
scanf("%d", &j);
if (j) goto loop;
return NULL;
}
        if (pre == NULL)
{
list = cur->next;
free(cur);
}
else
{
pre->next = cur->next;
free(cur);
    }
printf("该节点已经删除\n");
return list;
}
















猜你喜欢

转载自blog.csdn.net/lannister_awalys_pay/article/details/80142550
今日推荐