实现一个单向链表,要求:
1 对下表中的记录进行手工输入,并在输入完毕后,回显全部记录;
2 接受键盘输入:B,删除姓名为 B的记录,并打印链表中的所有记录。
Name | ID | Score |
A | 01234 | 98 |
B | 01237 | 97 |
C | 01236 | 65 |
#include <stdio.h> //包含的一些头文件
#include <stdlib.h>
#include <string.h>
struct mess//定义所需要的信息封装在结构体当中
{
char name[100];
int id;
int score;
};
typedef struct list_Node//创建专属链表结构体
{
struct mess person;
struct list_Node *next;
}list;
list *CreateEmptylist()//创建空链表
{
list *p = (list *)malloc(sizeof(list));//分配堆空间内存
memset(p->person.name, '\0', sizeof(p->person.name));//将p->person.name进行初始化
p->person.id = 0;//将id进行初始化
p->person.score = 0;//将分数进行初始化
p->next = NULL;//指针域置空
return p;//返回创建空链表的地址
}
void insertList(list *p, char *ScanfName, int ScanfId, int ScanfScore)//增加节点(形式参数信息)(尾插法)
{
list *q = malloc(sizeof(list));//创建新节点
strcpy(q->person.name, ScanfName);//给新节点进行赋值姓名信息
q->person.id = ScanfId;//给新节点进行赋值id信息
q->person.score = ScanfScore;//给新节点赋值分数信息
if(p->next == NULL)//如果链表是只有一个头节点时
{
p->next = q;//连接到头节点后
p = q;
}
else//如果链表除头节点外有其他头节点的话
{
while(p->next != NULL)//通过循环到最后一个节点
p = p->next;
p->next = q;//与新结点进行连接
p = q;
q->next = NULL;
}
}
void deleteListNode(list *p, char *ScanfName)//删除节点(包含的形式参数)
{
if (strcmp(ScanfName, p->person.name) == 0) {//判断用户输入的是否为第一个节点的数据
list *q = p;//如果是,进行节点删除
p = p->next;
free(q);
q = NULL;
printf("delete is ok\n");
return;
}
while(p)//如果不是,进行遍历,查看是否有节点信息相同
{
if(strcmp(ScanfName, p->next->person.name) == 0)//判断是否是对应节点,如果是退出
{
break;
}
p = p->next;//向下一个节点移动
}
list *q = p->next;//进行删除
p->next = q->next;
free(q);
q = NULL;
printf("delete is ok\n");
}
void printList(list *p)//打印节点的信息
{
while(p->next != NULL)//进行遍历打印
{
p = p->next;
printf("name :%s, id :%d, score :%d\n", p->person.name, p->person.id, p->person.score);
}
}
int main(int argc, const char *argv[])
{
list *h = CreateEmptylist();//创建空链表
int i, ScanfId, ScanfScore;//所需要的参数
char ScanfName[100] = { 0 }, deleteName[100] = { 0 };//所需要的参数
while(1)
{
printf("input your name, id, score, if you want not to input -1\n");
scanf("%s%d%d", ScanfName, &ScanfId, &ScanfScore);//输入增加节点信息
if(ScanfName[0] == -1 || ScanfScore == -1 || ScanfId == -1)//判断用户是否想要退出
{
break;
}
insertList(h, ScanfName, ScanfId, ScanfScore);//进入增加节点函数
memset(ScanfName, '\0', sizeof(ScanfName));//对于ScanfName进行初始化
}
printList(h);//打印节点
printf("input delete node name\n");
scanf("%s", deleteName);//输入想删除的节点
deleteListNode(h, deleteName);//进入删除函数
printList(h);//进行打印
return 0;
}