c语言创建一个存储数字的链表,C语言单链表的创建(附带源码)

了解了单链表的概念,接着我们就使用C语言来创建一个单链表。读入整数 n,建立一个单向链表,按顺序存储自然数 1 至 n。

该问题中,用于定义链表结点的结构体类型声明如下:

struct node{

int data; //表示自然数1~n

struct node *next; //定义链表后继指针

};

一个单向链表必然会有表头和表尾,因而定义两个结点指针 head 和 q,分别指向表头结点和表尾结点。初始链表只有一个结点(即是表头又是表尾)。在创建初始链表时,首先要给链表结点申请相应大小的内存空间,并给代表结点的结构体对象成员赋初值:

struct node *head, *q;

head = malloc(sizeof(struct node)); //为链表结点申请内存空间

head->data = 1; //初始结点成员初始化赋值

head->next = NULL;

初始链表的表头和表尾是同一结点,所以 q=head。

为了向链表中添加新的结点,我们定义一个指向当前结点的指针 new:

struct node *new;

同样地,要为它申请相应的内存空间,并把当前要存储的自然数 i 赋值给 new->data,即new->data=i;。把这个新结点 new 连接到初始链表的表尾,即q->next=new;,这样结点 new 成为了链表表尾,所以要把 new 的后续结点指向 NULL,同时将表尾结点指针 q 指向结点 new。

new = malloc(sizeof(struct node)); //申请内存空间

q->next = new; //加入新结点

new->data = i; //给数值域内的成员赋值

new->next = NULL; //后继指针指向为空

q = new; //设置为表尾结点

以上代码通过 for 循环执行 n-1 次,就可以将自然数 2 至 n 存储到链表中。

打印输出链表时,我们可以用当前指针 q 从表头结点 head 开始顺序遍历整个链表,直至其后继指针为空:

for(q=head; q!=NULL; q=q->next){

printf("%d",q->data);

}

C语言代码清单 1:创建一个单向链表,按顺序存储自然数 1 至 n

#include

#include

#include

struct node{

int d;

struct node *next;

};

struct node *head, *p, *q;

int main( )

{

int i,n;

printf("请输入一个正整数n:");

scanf("%d",&n);

head = malloc(sizeof(struct node)); //创建初始链表

head->d = 1;

head->next = NULL;

q = head; //初始链表表头就是表尾

for(i=2; i<=n; i++){

p = malloc(sizeof(struct node)); //申请内存空间

q->next = p; //加入新结点

p->d = i;

p->next = NULL;

q = p; //q指向表尾结点

}

for(p=head; p!=NULL; p=p->next){

printf("%d ",p->d);

}

printf("\n");

system("pause");

return 0;

}

运行结果为:

请输入一个正整数n:8

1 2 3 4 5 6 7 8

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要构造结构体链表,首先需要定义结构体的内容,包括学号、姓名和成绩。 ```c #include <stdio.h> #include <stdlib.h> // 定义结构体 typedef struct student { int id; char name[20]; int score; struct student* next; } Student; int main() { int n; printf("请输入学生人: "); scanf("%d", &n); Student* head = NULL; Student* tail = NULL; // 输入学生信息并构造链表 for (int i = 0; i < n; i++) { printf("\n请输入第%d个学生的学号: ", i+1); int id; scanf("%d", &id); printf("请输入姓名: "); char name[20]; scanf("%s", name); printf("请输入成绩: "); int score; scanf("%d", &score); // 创建新的学生结点 Student* newStudent = (Student*)malloc(sizeof(Student)); newStudent->id = id; strcpy(newStudent->name, name); newStudent->score = score; newStudent->next = NULL; // 将新的学生结点加入链表 if (head == NULL) { head = newStudent; tail = newStudent; } else { tail->next = newStudent; tail = tail->next; } } // 遍历链表并打印学生信息 printf("\n学生信息如下:\n"); Student* current = head; while (current != NULL) { printf("学号: %d\n", current->id); printf("姓名: %s\n", current->name); printf("成绩: %d\n", current->score); printf("\n"); current = current->next; } // 释放链表内存 while (head != NULL) { Student* temp = head; head = head->next; free(temp); } return 0; } ``` 以上是一个通过输入学生信息构造结构体链表的程序。首先输入学生人,然后按照提示输入每个学生的学号、姓名和成绩。程序将会创建新的学生结点,并通过将结点链接在一起构造链表。最后,程序将会遍历链表并打印每个学生的学号、姓名和成绩。最后释放链表内存,结束程序的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值