zqdlly 发表于 2020-5-7 21:00:57

请问关于小甲鱼链表创建的问题

大家都知道,小甲鱼创建链表是以输入0为结束标志的。而且是学号。于是我想模仿建立一个以输入“over”为结束标志的,用名字字符串表示。那么问题是,为什么我每次输出结果,name全都是最后一个成员的nam?

zqdlly 发表于 2020-5-7 21:02:02

本帖最后由 zqdlly 于 2020-5-7 23:21 编辑

源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

#define LEN sizeof(struct general) //general结构的大小

struct general *creatList();//创建链表;
void printList(struct general* head);//打印列表
struct general
{
    char* name;
    int force;
    int intelligence;
    struct general *next;//对链表很重要
};
int n;
struct general *creatList()//创建链表;
{
    struct general *head;
    struct general *p1,*p2;

    p1=p2=(struct general *)malloc(LEN);//LEN general结构的大小,这里p1和p2都指向第一个申请的新节点

    printf("Enter the name:");
    scanf("%s",p1->name);
    printf("Enter the force:");
    scanf("%d",&p1->force);
    printf("Enter the intelligence:");
    scanf("%d",&p1->intelligence);

    head=NULL;
    n=0;//计数器,记录存放个数

    while(strcmp(p1->name,"over")!=0 )//当输入0的时候退出循环
    {
      n++;
      if(n==1)//只有第一次有效
      {
            head=p1;
      }
      else//
      {
            p2->next=p1;
      }
      p2=p1;

      p1=(struct general *)malloc(LEN);//p1再申请一个节点

      printf("\nEnter the name:");
      scanf("%s",p1->name);
      printf("Enter the force:");
      scanf("%d",&p1->force);
      printf("Enter the intelligence:");
      scanf("%d",&p1->intelligence);

    }
    p2->next=NULL;

    return head;//返回链表头结点的指针,相当于数组的首地址。链表就是强化版的数组,比如插入等操作,数组很难,链表容易ccccc
};
void printList(struct general* head)
{
        structgeneral* pMove;
        pMove = head;
    if(head)
      {
             do
                {
                  printf("name:%s   武力:%d智力:%d\n", pMove->name, pMove->force, pMove->intelligence);
                  pMove = pMove->next;
                }while(pMove);
      }
    printf("总人数=%d\n",n);
}

main()
{
    struct general *gen;

    gen=creatList();
    printList(gen);//打印链表需要自定义函数,c没有内置
    system("pause");

}

pupil337 发表于 2020-5-7 22:44:01

D:\123.png
这样写(略了一些功能),你这看的有点头疼,数据结构还是看书和博客比较好。

pupil337 发表于 2020-5-7 22:45:49

// 下面是链表的结构
struct node {
        char* name;
    int force;
    int intelligence;
    struct general *next;
};

struct list{
        node* head;
        int count;// 记录存放个数
};

//----------
//↓维护链表的函数

void CreateList();
void DestroyList();
void makeNode();
void AddNode();

//---------------------
//伪代码输入过程↓
while scanf x true
        addNode(x)
else break

void addNode(参数列表x) {
        makeNode();
        //判空 和 next等操作
}

我图片呢。。。

superbe 发表于 2020-5-7 23:18:12

本帖最后由 superbe 于 2020-5-7 23:22 编辑

char* name;
name成员只是一个char *的指针,而你并没有给输入的名字字符串分配内存空间。
这是修改过的代码,包括其它一些修改。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

#define LEN sizeof(struct general)//general结构的大小
#define NLEN 30//名字最大长度

struct general *creatList();//创建链表;
void printList(struct general* head);//打印列表

struct general
{
    char* name;
    int force;
    int intelligence;
    struct general *next;//指向下一节点
};

int n = 0;

struct general *creatList()//创建链表
{
    struct general *head = NULL;
    struct general *p1, *p2;
    char sname;

    printf("Enter the name: ");
    scanf("%s", sname);
    while (strcmp(sname, "over") != 0)
    {
      p1 = (struct general *)malloc(LEN);
      p1->name = (char *)malloc(strlen(sname) + 1);//删除节点时要释放分配的内存
      strcpy(p1->name, sname);
      printf("Enter the force: ");
      scanf("%d", &p1->force);
      printf("Enter the intelligence: ");
      scanf("%d", &p1->intelligence);
      p1->next = NULL;
      if (n == 0)
            head = p1;
      else
            p2->next = p1;
      p2 = p1;
      n++;
      printf("\nEnter the name: ");
      scanf("%s", sname);
    }

    return head;
}

void printList(struct general* head)
{
    structgeneral* pMove;

    pMove = head;
    while (pMove)
    {
      printf("name:%s   武力:%d智力:%d\n", pMove->name, pMove->force, pMove->intelligence);
      pMove = pMove->next;
    }
    printf("总人数 = %d\n", n);
}

int main()
{
    struct general *gen;

    gen = creatList();
    printList(gen);
    system("pause");
    return 0;
}

zqdlly 发表于 2020-5-7 23:24:34

pupil337 发表于 2020-5-7 22:45
// 下面是链表的结构
struct node {
        char* name;


谢谢,更规范的模式,学习了

zqdlly 发表于 2020-5-7 23:47:02

superbe 发表于 2020-5-7 23:18
char* name;
name成员只是一个char *的指针,而你并没有给输入的名字字符串分配内存空间。
这是修改过的 ...

感谢大佬细心指教!好好研究一下改动的细节
页: [1]
查看完整版本: 请问关于小甲鱼链表创建的问题