| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 370 人关注过本帖, 1 人收藏
标题:删除信息,我感觉写的思路还算清晰,拿出来与大家共享,链表的删除(结构体 ...
只看楼主 加入收藏
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
结帖率:96.77%
收藏(1)
 问题点数:0 回复次数:1 
删除信息,我感觉写的思路还算清晰,拿出来与大家共享,链表的删除(结构体的嵌套)
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Record
{
    int number;
    char name[20];
    char sex[20];
    int age;
}Student;
typedef struct node
{
    Student  p;
    struct  node *next;
   
}LNode,*Linklist;

int  create_list(Linklist &L,int n)
{
    Linklist q,r;
    int i;
    r=L;
    for(i=0;i<n;i++)
    {
        q=(Linklist)malloc(sizeof(LNode));
        if(!q)
            return 0;
        printf("请输入第%d个学生的信息:\n",i+1);
        printf("学号: \n");
        scanf("%d",&(q->p.number));
        getchar();
        printf("姓名:\n");
        scanf("%s",q->p.name);
        getchar();
        printf("性别:  \n");
        scanf("%s",q->p.sex);
        getchar();
        printf("年龄:  \n");
        scanf("%d",&(q->p.age));
        getchar();
        q->next=NULL;
        r->next=q;
        r=q;
    }
    return 1;
   
}
void print_list(Linklist &L)
{
    Linklist q;
    q=L->next;
    while(q!=NULL)
    {
        printf("学号:%d   姓名:%s  性别:%s  年龄: %d  ",q->p.number,q->p.name,q->p.sex,q->p.age);
        printf("\n");
        q=q->next;
    }
}


 int find_list(Linklist &L,int number)

 {
     Linklist q,s;
     int flag=0;
     q=L;
     while(q->next!=NULL)//当不是最后一个节点时
     {
         while(q->p.number!=number&&q->next!=NULL)//设定两个指针分别指向当前节点和它的前一个结点,要保证q不是最后一个节点,此时外层循环已不起作用了!
         {
             s=q;
             q=q->next;
         }
         if(q->p.number==number)
         {
             if(q==L->next)//如果删除的是第一个元素,要注意它是带头结点的链表,注意是两个等号,if里的判等式是双等号的,数字的时候不会犯错,但是指针的时候很容犯错的!
             {
                 L->next=q->next;
                 flag=1;
                 free(q);
                 break;
             }
             if(q->next==NULL)//如果是最后的一个元素。
             {
                 s->next=NULL;
                 flag=1;
                 free(q);
                 break;
             }
             if(q!=L->next&&q->next!=NULL)//如果是中间元素
             {
                 s->next=q->next;
                 flag=1;
                 free(q);
                 break;
             }
         }
     }
    return flag;


 }
int main()
{
    Linklist  L;
    int n;
    int number;
    printf("请输入学生人数亲!\n");
    scanf("%d",&n);
    L=(Linklist)malloc(sizeof(LNode));
    printf("请输入学生信息亲!\n");
    create_list(L,n);
    printf("原有的学生信息是:\n");
    print_list(L);
    printf("请你输入要查找的学号:\n");
    scanf("%d",&number);
    if(number==-1)
        printf("输入错误!\n");
    if(find_list(L,number))
    {
         printf("找到了亲!\n");
         printf("此时剩下的学生信息是:\n");
         print_list(L);
    }
    else
        printf("没有找到哦!\n");
    return 0;

}
其实还可以在此基础上做更多的改进,比如输入学号的限制(限定在一个范围内),性别的输入限制,等等。我感觉删除链表的中的节点
书上写的有的太笼统了。我是新手,勿喷!
搜索更多相关主题的帖子: 信息 number 结构体 
2012-11-20 20:39
xwxc
Rank: 1
等 级:新手上路
帖 子:10
专家分:2
注 册:2012-11-17
收藏
得分:0 
我是来学习的、、
2012-11-20 20:55
快速回复:删除信息,我感觉写的思路还算清晰,拿出来与大家共享,链表的删除(结 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023101 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved