求一个大一c语言链表的简单程序,涉及到建立,查询,删除以及函数的调用
参考:https://blog.csdn.net/qfl_sdu/article/details/118326835
链表的增删改查操作都有
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int value;
struct LNode *next;
} LNode, *Linklist;
Linklist list_Creat()
{
int value;
Linklist L = (Linklist)malloc(sizeof(LNode));
LNode *head = L, *rear = L;
head->next = NULL;
head->value = 0;
printf("请输入链表的值,输入-1结束:\n");
scanf("%d", &value);
while (value != -1)
{
Linklist s = (Linklist)malloc(sizeof(LNode));
s->value = value;
s->next = NULL;
rear->next = s;
rear = s;
scanf("%d", &value);
}
return L;
}
void list_Display(Linklist L)
{
LNode *p = L->next;
while (p != NULL)
{
printf("%d ", p->value);
p = p->next;
}
printf("\n");
}
int list_Query(Linklist L, int val)
{
Linklist p = L->next;
while (p != NULL)
{
if (p->value == val)
{
printf("已找到%d!\n", val);
return 1;
}
p = p->next;
}
printf("找不到查询的数!\n");
return -1;
}
void list_Del(Linklist L, int val)
{
Linklist p = L->next, pre;
pre = p;
while (p != NULL)
{
if (p->value == val)
{
pre->next = p->next;
free(p);
p = pre->next;
printf("已删除%d!\n", val);
return;
}
pre = p;
p = p->next;
}
printf("%d不存在!\n", val);
}
int main()
{
Linklist L1 = NULL;
int s = 0, val;
do
{
printf("\n\t1.建立链表\n");
printf("\t2.查询\n");
printf("\t3.删除\n");
printf("\t4.显示链表\n");
printf("\t5.退出\n");
printf("\t输入选择:");
scanf("%d", &s);
switch (s)
{
case 1:
L1 = list_Creat();
break;
case 2:
printf("输入要查询的数:");
scanf("%d", &val);
list_Query(L1, val);
break;
case 3:
printf("输入要删除的数:");
scanf("%d", &val);
list_Del(L1, val);
break;
case 4:
list_Display(L1);
break;
case 5:
exit(0);
break;
}
} while (1);
return 0;
}
修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMBSCORE 3
struct StNode
{
int num; //学号
char name[20]; //姓名
StNode* next;
};
//录入信息
struct StNode* Input(struct StNode* head)
{
struct StNode* p,*node;
int i;
system("cls");
node = (struct StNode*)malloc(sizeof(struct StNode));
//录入信息
printf("请输入学号:");
scanf("%d",&node->num);
printf("请输入姓名:");
scanf("%s",node->name);
node->next = 0;
if (head == 0)
{
head = node;
//
}else
{
p = head;
while(p->next)
p = p->next;
//新建节点
p->next = node;
}
system("pause");
return head;
}
//显示所有学生信息
void showAll(struct StNode* head)
{
struct StNode* p;
int i=1,j;
system("cls");
p = head;
while(p)
{
printf("学生%d学号:%d\n",i,p->num);
printf("学生%d姓名:%s\n",i,p->name);
printf("\n");
i++;
p = p->next;
}
system("pause");
}
//查询信息
void Find(struct StNode* head)
{
int opt;
struct StNode* p = head;
int id,j;
char name[20]={0};
system("cls");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
scanf("%d",&opt);
switch(opt)
{
case 1:
printf("请输入学号:");
scanf("%d",&id);
while(p)
{
if(p->num == id)
{
printf("学生学号:%d\n",p->num);
printf("学生姓名:%s\n",p->name);
printf("\n");
break;
}
p = p->next;
}
if(p==0)
printf("查无此人\n");
break;
case 2:
printf("请输入姓名:");
scanf("%s",name);
while(p)
{
if(strcmp(p->name,name) ==0)
{
printf("学生学号:%d\n",p->num);
printf("学生姓名:%s\n",p->name);
printf("\n");
break;
}
p = p->next;
}
if(p==0)
printf("查无此人\n");
break;
}
system("pause");
}
//删除学生信息
void DeleteInfo(struct StNode* head)
{
struct StNode* node,*pre;
int id,i;
system("cls");
printf("请输入需要删除信息的学生学号:");
scanf("%d",&id);
if (head->num == id)
{
node = head->next;
free(head);
head = node;
printf("该学生信息已经删除\n");
system("cls");
return;
}else
{
pre = head;
node = head->next;
while(node)
{
if (node->num == id)
{
pre->next = node->next;
free(node);
node = 0;
printf("该学生信息已经删除\n");
system("pause");
return;
}else
{
pre = node;
node = node->next;
}
}
printf("查无此人\n");
system("pause");
}
}
int main()
{
struct StNode* head = 0;
int opt = 0;
int bgo = 1;
while(bgo)
{
system("cls");
printf("--------------学生信息管理系统---------------|\n");
printf("| 1.录入学生信息 |\n");
printf("| 2.显示所有学生信息 |\n");
printf("| 3.学生信息查询 |\n");
printf("| 4.学生信息删除 |\n");
printf("| 0.退出系统 |\n");
printf("----------------------------------------------\n");
scanf("%d",&opt);
switch(opt)
{
case 0:
bgo = 0;
break;
case 1:
head = Input(head);
break;
case 2:
showAll(head);
break;
case 3:
Find(head);
break;
case 4:
DeleteInfo(head);
break;
}
}
return 0;
}