博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体与指针
阅读量:6675 次
发布时间:2019-06-25

本文共 3779 字,大约阅读时间需要 12 分钟。

hot3.png

 

结构体与指针

最近在写一个关于指针操作结构体形成链表,对链表进行插入、删除、修改等操作

在据介绍这部分的内容是你必须知道一下内容:

什么是指针。指针的概念和基本的指针操作等

什么是结构体,结构体的概念和基本用法

在了解看了以上的内容之后,我们开始写关于链表得到操作

首先我们需要定义一个结构体类型,由于我们要把代码分开,所以我们把都要用的内容写到头文件里然后应用就可以了

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");

}

最后我们建立一个工程把这些文件都包含进工程里编译运行就可以了

转载于:https://my.oschina.net/shenruifir/blog/112814

你可能感兴趣的文章
linux文件系统 - 初始化(二)
查看>>
Python的可视化图表工具集
查看>>
《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》
查看>>
三个文件,
查看>>
webpack的总结
查看>>
hibernate 一级缓存和二级缓存
查看>>
javac不是内部或外部命令
查看>>
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>
【HDOJ】3016 Man Down
查看>>
window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;...
查看>>
查看本机IP分为两种情况:
查看>>
Scala进阶之路-Scala特征类与unapply反向抽取
查看>>
洛谷P3057 [USACO12NOV]远处的牧场Distant Pastures
查看>>
hdu3415 Max Sum of Max-K-sub-sequence 单调队列
查看>>
6421B Lab2 DHCP的配置及故障排除
查看>>
[C# 基础知识梳理系列]专题一:深入解析委托——C#中为什么要引入委托
查看>>
FOSCommentBundle功能包:其它添加评论到页面的方法
查看>>