请问关于小甲鱼链表创建的问题
大家都知道,小甲鱼创建链表是以输入0为结束标志的。而且是学号。于是我想模仿建立一个以输入“over”为结束标志的,用名字字符串表示。那么问题是,为什么我每次输出结果,name全都是最后一个成员的nam? 本帖最后由 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");
}
D:\123.png
这样写(略了一些功能),你这看的有点头疼,数据结构还是看书和博客比较好。 // 下面是链表的结构
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: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;
}
pupil337 发表于 2020-5-7 22:45
// 下面是链表的结构
struct node {
char* name;
谢谢,更规范的模式,学习了 superbe 发表于 2020-5-7 23:18
char* name;
name成员只是一个char *的指针,而你并没有给输入的名字字符串分配内存空间。
这是修改过的 ...
感谢大佬细心指教!好好研究一下改动的细节
页:
[1]