单链表操作元素为结构体,实现增加,删除,查找,修改。 源代码:
#include<stdio.h>
#include<malloc.h>
#include<string>
#pragma warning(disable:4996)
typedef struct Student
{
char name[12];
int age;
char address[50];
}Elemtype;
typedef struct Man {
Student data;
struct Man* next;
}Man,*LinkMan;
void main_menu(LinkMan L);
int InitLink(LinkMan *L);
int InsertLink(LinkMan L, int i, Elemtype* e);
int DeleteLink(LinkMan L, int &i);
int SearchLink(LinkMan L, const int& i);
int UpdateLink(LinkMan L, int& i);
int PrintLink(LinkMan L);
int main(void)
{
int result(0);
Student e;
LinkMan L=NULL;
printf("*************************[菜鸟到底有多菜]********************************************\n");
printf("**********本软件学生信息结构体,姓名占12个字节,地址50个字节,请勿超出!!!****************\n");
result=InitLink(&L);
if (result) printf("初始化成功\n");
else printf("初始化失败\n");
printf("请输入要插入元素的个数;");
scanf("%d", &result);
printf("请输入插入节点的元素:\n");
for (int i = 1; i <= result; i++)
{
printf("请输入学生姓名:");
scanf("%s",&e.name);
printf("请输入学生年龄:");
scanf("%d", &e.age);
printf("请输入学生家庭地址:");
scanf("%s", &e.address);
InsertLink(L,i, &e);
}
main_menu(L);
return 0;
}
void main_menu(LinkMan L)
{
int id,position;
Elemtype e;
printf("请选择要进行的操作(0 退出本软件 1打印整个链表 2查找某个位置的节点 3删除某个节点 4修改某个节点 5插入某个节点):");
scanf("%d", &id);
switch (id)
{
case 0:
printf("bye~,欢迎下次继续使用");
break;
case 1:
printf("打印所有节点的结果;\n");
PrintLink(L);
main_menu(L);
break;
case 2:
printf("请输入要查找的节点的位置:");
scanf("%d", &position);
SearchLink(L, position);
main_menu(L);
break;
case 3:
printf("请输入要删除的节点位置:");
scanf("%d", &position);
DeleteLink(L, position);
main_menu(L);
break;
case 4:
printf("请输入要修改的节点位置:");
scanf("%d", &position);
UpdateLink(L, position);
main_menu(L);
break;
case 5:
printf("请输入要插入的节点位置:");
scanf("%d", &position);
printf("请输入学生姓名:");
scanf("%s", &e.name);
printf("请输入学生年龄:");
scanf("%d", &e.age);
printf("请输入学生家庭地址:");
scanf("%s", &e.address);
InsertLink(L, position, &e);
main_menu(L);
break;
default:
break;
}
}
int InitLink(LinkMan *L)
{
Man *head = (Man*)malloc(sizeof(Man));
if (!head)
{
printf("初始化失败\n"); return 0;
}
head->next = NULL;
*L = head;
return 1;
}
int InsertLink(LinkMan L, int i, Elemtype* e)
{
if (i < 1 || e == NULL)
{
printf("插入的位置或者元素为空\n");
return 0;
}
Man* temp = (Man*)malloc(sizeof(Man));
if (temp==NULL)
{
printf("内存分配新节点失败\n");
}
memcpy(temp, e, sizeof(Elemtype));
LinkMan p = L;
int k = 0;
while (p!=NULL&&k<i-1)
{
p = p->next;
k++;
}
if (p == NULL)
{
printf("插入的位置不合法,前面的节点为空节点\n");
return 0;
}
else
{
p->next = temp;
temp->next = NULL;
}
return 1;
}
int DeleteLink(LinkMan L, int& i)
{
if (i < 1)
{
printf("删除的位置输入错误,应该为>1的数\n");
return 0;
}
LinkMan p = L;
int k = 0;
while (p != NULL && k < i - 1)
{
p = p->next;
k++;
}
if (p->next == NULL)
{
printf("删除的位置超过了表长\n");
return 0;
}
else
{
LinkMan temp = p->next;
p->next = p->next->next;
free(temp);
}
return 1;
}
int SearchLink(LinkMan L,const int& i)
{
if(i<1)
{
printf("查找的位置输入错误,应该为>1的数\n");
return 0;
}
LinkMan p = L;
int k = 0;
while (p!=NULL&&k<i)
{
p = p->next;
k++;
}
if (!p)
{
printf("查找的位置超过了表长\n");
return 0;
}
else
{
printf("学生的姓名:%3s, 学生的年龄:%3d, 学生的家庭地址:%3s\n", p->data.name, p->data.age, p->data.address);
return 1;
}
}
int UpdateLink(LinkMan L, int& i)
{
if (i < 1)
{
printf("删除的位置输入错误,应该为>1的数\n");
return 0;
}
LinkMan p = L;
int k =0;
while (p!=NULL&&k<i)
{
p = p->next;
k++;
}
if (p==NULL)
{
printf("修改的位置超过了表长\n");
return 0;
}
Elemtype e;
printf("请输入修改后学生姓名:");
scanf("%s", &e.name);
printf("请输入修改后学生年龄:");
scanf("%d", &e.age);
printf("请输入修改后学生家庭地址:");
scanf("%s", &e.address);
memcpy(p, &e, sizeof(Elemtype));
return 1;
}
int PrintLink(LinkMan L)
{
LinkMan p = L->next;
if (!p) {
printf("这是一个空表\n");
return 0;
}
while (p!=NULL)
{
printf("学生的姓名:%3s, 学生的年龄:%3d, 学生的家庭地址:%3s\n",p->data.name,p->data.age,p->data.address);
p = p->next;
}
return 1;
}
运行结果:
|