标题:C语言链表的优化
只看楼主
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
结帖率:100%
已结贴  问题点数:20 回复次数:7 
C语言链表的优化
希望有大佬可以帮我优化一下链表的代码或者可以为我提供一些好的建议,总感觉代码太长了而且学的也比较少,本人水平有限,代码已经粘贴好了,下面的代码实现了链表的动态创建、插入、删除和输出
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
#define NUM 10
int n=0;//定义全局变量表示节点的序号数
struct student
{
    long num;
    int score;
    int age;
    struct student *next;
};
struct student *creat()//链表的创建
{
    struct student *p1,*p2,*head;
    head=NULL;//意思是现在的链表为空
    p1=p2=(struct student*)malloc(LEN);//让指针p1,p2指向新开辟的一个空间
    printf("请输入学生学号、分数和年龄:\n");
    scanf("%ld%d%d",&p1->num,&p1->score,&p1->age);
    while(p1->num!=0)
    {
        n++;
        if(n==1){head=p1;}//如果是第一个节点就让head指向p1
        else {p2->next=p1;}//如果不是第一个节点就让上一个节点的指针域指向下一个节点
        p2=p1;//让p2也指向下一个部分的地址
        p1=(struct student*) malloc(LEN);//再开辟一个新的空间
        printf("该学生的信息已经存好\n");
        scanf("%ld%d%d",&p1->num,&p1->score,&p1->age);
    }
    p2->next=NULL;//当输入的学号为0的时候,表示链表最后一个节点的指针域指向NULL,链表创建完成
    printf("学生信息已经存储好!\n");
    return (head);
}
struct student *del(struct student *head)//链表的删除操作
{
    int num1;//学生学号
    struct student *p=head,*p3=head;
    printf("请输入你想要删除的学生的学号:");
    scanf("%d",&num1);
    if (head==NULL)
    {
        printf("没有存任何学生的信息");
        return (head);
    }
    while(num1!=p->num && p->next!=NULL){p3=p;p=p->next;}//如果p指向的不是要删除的节点,且还存在下一个节点,就让p指向下一个节点,并让p3指向当前节点
    if(p==head)
        {
            head=p->next;
        }//如果要删除第一个节点的信息,就让head指向下一个节点,若接下来没节点,则 p->next的值就为NULL
    else
    {
        if(num1==p->num )
        {
            p3->next=p->next;
        }
        else
        {
            printf("输入的学号不存在!");
        }
   
    } //否则直接让前一个节点的指针指向下下个节点
    return (head);
}
struct student *insert(struct student *head)//链表的插入操作
{
    int n2=0;//
    int n1;//和n2进行比较 ,n1为用户输入的节点序号,表示想要添加节点到第几个节点后面,n1=0就是直接添加到最前面
    struct student *p=head,*p3,*p4=head;
     if (head==NULL)
     {
         printf("没有存任何学生的信息");
         return head;
     }
     printf("请输入你想要添加学生的信息添加到第几个学生的后面:");
     scanf("%d",&n1);
     while(true)
     {
         if (n1==0)//如果要在最前面添加信息
         {
             p3=(struct student*) malloc(LEN);
             printf("请输入学生学号、分数和年龄:\n");
             scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
             head=p3;
             p3->next=p;
             break;
         }
         else if(n1==n && n2==n)//如果添加到最后面
         {
             p3=(struct student*) malloc(LEN);
             printf("请输入学生学号、分数和年龄:\n");
             scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
             p4->next=p3;
             p3->next=NULL;
             break;
          }
          else
          {
              if(n1==n2)
              {
                  p3=(struct student*) malloc(LEN);//开辟一个新的学生信息区域
                  printf("请输入学生学号、分数和年龄:\n");
                  scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
                  p4->next=p3; //让前一个学生信息区域的指针指向域的指针指向新的学生信息区域
                  p3->next=p;//让新的学生信息区域的指针域的指针指向后一个学生信息区域
                break;
              }
              p4=p3=p;//此时p3、p4指向的节点序号为n2
              n2++;
             p=p->next;//需要注意的是此时p指向的节点序号为n2+1     
          }
     }
     return (head);
}
struct student *print(struct student *head)//输出链表
{
    struct student *p=head;
    printf("输出学生信息:\n");
    while(p!=NULL)
    {
        printf("%ld\t%d\t%d\n",p->num,p->score,p->age);
        p=p->next;//让p指向下一个区域的指针域
    }
}
int main()
{
    struct student *head;
    head=creat();//创建链表
    print(head);//输出链表
    head=insert(head);//增添一个学生的信息
    print(head); //输出链表
    head=del(head);//删除一个学生的信息
    print(head); //输出链表
    return 0;
}
搜索更多相关主题的帖子: head student 链表 节点 struct 
2020-06-14 19:45
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:20 
程序代码:
#include <stdio.h>
#include <stdlib.h>

struct student {
    int score;
    struct student *next;
};

struct student *head = 0;

void creat(int score)
{
    struct student *temp;
    temp = (struct student *)malloc(sizeof(struct student));
    temp->score = score;
    temp->next = head;
    head = temp;
}

void delete(void)
{
    struct student *temp;
    for (temp = head; temp; temp = temp->next)
        free(temp);
    head = 0;
}

void print(void)
{
    struct student *temp;
    for (temp = head; temp; temp = temp->next)
        printf("%d%c", temp->score, temp->next?' ':'\n');
}

void main(void)
{
    int score;
    while (scanf("%d", &score) != EOF)
        creat(score);
    print();
    delete();
}


我自己喜欢清爽一点的风格,有些代码没整,仅供参考

[此贴子已经被作者于2020-6-15 11:03编辑过]


梦想拥有一台龙芯3A-4000
2020-06-14 20:28
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
得分:0 
回复 2楼 ditg
很抱歉现在才回,这个代码的话,delete函数里面那个for循环那种使用方式还有print函数里的三目运算的这种使用方式倒是第一次碰到,学到了,不过我觉得直接printf("%d   ", temp->score);好像更简单一点,还有可能是由于用的软件不一样,我在执行的时候,是这样的
,然后它就一直卡着了,接下来它不应该是输出一个按任意键退出吗,这就很奇怪了,好像进程没停止,只能Ctrl+C才能退出
2020-06-16 15:35
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
得分:0 
回复 2楼 ditg
2020-06-16 15:56
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
回复 3楼 rain9797
抱歉抱歉,现在我几乎不使用windows了,里面的东西真忘差不多了。

(教你一手,可以吼一下r版或其他版主,脾气不是很好但绝对是个好人。反正涨知识呗,首先得学会忍辱负重!)

再补一点:你要有一天真能把他激怒,就离顶尖高手不远了

[此贴子已经被作者于2020-6-16 16:17编辑过]


梦想拥有一台龙芯3A-4000
2020-06-16 16:16
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
得分:0 
回复 5楼 ditg
吼不来人啊
2020-06-16 19:59
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
找几个核心关键点问。换成你自己,这一大段代码的,就算复制粘贴还得带帮着改错,这不折腾人呢嘛。这些版主又不是初学者,大概说一声人家就懂了,别瞎担心非得完整代码才懂。

以前论坛里好像有个关于怎么提问题的贴子,不知道跑哪去了

[此贴子已经被作者于2020-6-16 20:50编辑过]


梦想拥有一台龙芯3A-4000
2020-06-16 20:45
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
得分:0 
回复 7楼 ditg
哦哦懂了,谢谢
2020-06-16 21:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502123-1-1.html




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

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