结构体与指针
最近在写一个关于指针操作结构体形成链表,对链表进行插入、删除、修改等操作
在据介绍这部分的内容是你必须知道一下内容:
什么是指针。指针的概念和基本的指针操作等
什么是结构体,结构体的概念和基本用法
在了解看了以上的内容之后,我们开始写关于链表得到操作
首先我们需要定义一个结构体类型,由于我们要把代码分开,所以我们把都要用的内容写到头文件里然后应用就可以了
Typedef Struct struc
{
Int ID;
Char name[5];
Inr sex[2];
} Student;
好的结构的定义完了之后我们开始创建链表,我们把整个代码分开,分为每个单独的部分进行代码的编写
首先是创建链表的方法,我们把这个文件命名为“CreateNode.c”
#include "stdio.h"
#include "stdlib.h"
#include "Node.h"
Student * CreateNode()
{
char c;
Student *head,*curNode,*newNode;
printf("开始创建一个新的Student链表\n");
newNode=(Student *)(malloc(sizeof(Student)));
head=newNode;
curNode=newNode;
printf("ID:");
scanf("%d",&newNode->ID);
printf("姓名:");
scanf("%s",newNode->name);
printf("性别:");
scanf("%d",&newNode->sex);
newNode->index=0;
while(1)
{
printf("是否要继续创建链表?是(Y)/否(N)");
scanf("%s",&c);
if(c=='y'||c=='Y')
{
newNode=(Student *)(malloc(sizeof(Student)));
curNode->index=newNode;
curNode=newNode;
printf("ID:");
scanf("%d",&newNode->ID);
printf("姓名:");
scanf("%s",newNode->name);
printf("性别:");
scanf("%d",&newNode->sex);
newNode->index=0;
}
else
break;
}
return head;
}
继续写一个进行链表插入的方法并个新文件命名为“InsertNode.c”
// 向指定的链表中插入节点
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "Node.h"
Student * InsertNode(Student *head)
{
Student *newNode;
char c;
Student *insert = head,*preNode = head;
int id;
newNode=(Student *)malloc(sizeof(Student));
printf("开始创建一个新节点\nID:");
scanf("%d",&newNode->ID);
printf("姓名:");
scanf("%s",newNode->name);
printf("性别:");
scanf("%d",&newNode->sex);
set: printf("请输入要插入到之后节点的id属性值:"); /set 标记/
scanf("%d",&id);
while(insert)
{
if(insert->ID==id)
{
newNode->index=insert->index;
insert->index=newNode;
break;
}
else
{
preNode=insert->index;
insert=insert->index;
}
}
if(preNode->index==0)
{
printf("没有查到你要插入节点的属性,是否要继续插入节点? 是(Y)/否(N)/修改属性(S)");
scanf("%s",&c);
if(c=='y'||c=='Y')
{
printf("你要将新的节点插入到整个节点什么位置?之前(H)/之后(E)");
scanf("%s",&c);
if(c=='H'||c=='h')
{
newNode->index=head;
head = newNode;
}
else
{
newNode->index=insert->index;
insert->index=newNode;
}
}
else if(c=='N'||c=='n')
{
free(newNode);
}
else if(c=='s'||c=='S')
{
goto set;
}
}
return head;
}
接下来是创建一个链表的删除方法,我们给新文件命名为“DeleteNode.c”
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "Node.h"
Student * DeleteNode(Student *head)
{
Student *del=head,*preNode=head;
int id;
printf("请输入欲删除节点的id属性:");
scanf("%d",&id);
while(del)
{
if(del->ID==id)
{
preNode->index=del->index;
free(del);
break;
}
else
{
preNode=del;
del=del->index;
}
}
if(preNode->index==0)
{
printf("没有查到你要删除节点的属性!");
}
return head;
}
有兴趣还可以写一个关于删除所有链表节点的方法,其原理方法和删除节点方法类似,只不过是逐个删除每个链表的节点,在这里我就补贴代码了
最后再写一个输出链表内容的方法,我们给新文件命名为“Print.c”
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "Node.h"
void Print(Student *head)
{
while(head!=0)
{
printf("ID:%-3d 姓名:%-6s,性别:%2d\n",head->ID,head->name,head->sex);
head=head->index;
}
}
当你做完了以上每个部分代表你已经成功了一半了,那么接下来我们需要做甚呢,对我们需要写一个程序的主方法啊不是,好的,先在我们来写main函数的方法,我们给新文件命名为“Main.c”
//
// 结构体运用和指向指针的指针操作
//
// 开发环境:Visual C++ 6.0
//
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "Node.h"
Student *stu;
void main()
{
char c,dos[10];
Student *del;
N: stu =CreateNode();
R: printf("请选择操作:\n");
printf("1 ----- 输出当前链表\n");
printf("2 ----- 插入节点\n");
printf("3 ----- 删除节点\n");
printf("4 ----- 删除所有节点\n");
printf("e ----- 退出\n");
scanf("%s",&c);
if(c=='1')
Print(stu);
else if(c=='2')
stu= InsertNode(stu);
else if(c=='3')
stu = DeleteNode(stu);
else if(c=='4')
{
if(DeleteAll(stu)==1)
{
printf("是否要创建新的链表? 是(Y)/否(N)");
scanf("%s",&c);
if(c=='y'||c=='Y')
goto N;
else
goto ED;
}
}
else if(c=='e')
goto E;
else
{
printf("请输入DOS指令:");
scanf("%s",dos);
system(dos);
}
goto R;
E: do
{
del=stu;
stu = del->index;
free(del);
}while(stu!=0);
ED: system("pause");
}
最后我们建立一个工程把这些文件都包含进工程里编译运行就可以了