C语言单链表的创建(附带源码)
了解了单链表的概念,接着我们就使用C语言来创建一个单链表。读入整数 n,建立一个单向链表,按顺序存储自然数 1 至 n。
该问题中,用于定义链表结点的结构体类型声明如下:
一个单向链表必然会有表头和表尾,因而定义两个结点指针 head 和 q,分别指向表头结点和表尾结点。初始链表只有一个结点(即是表头又是表尾)。在创建初始链表时,首先要给链表结点申请相应大小的内存空间,并给代表结点的结构体对象成员赋初值:
为了向链表中添加新的结点,我们定义一个指向当前结点的指针 new:
同样地,要为它申请相应的内存空间,并把当前要存储的自然数 i 赋值给 new->data,即
以上代码通过 for 循环执行 n-1 次,就可以将自然数 2 至 n 存储到链表中。
打印输出链表时,我们可以用当前指针 q 从表头结点 head 开始顺序遍历整个链表,直至其后继指针为空:
C语言代码清单 1:创建一个单向链表,按顺序存储自然数 1 至 n
运行结果为:
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
该问题中,用于定义链表结点的结构体类型声明如下:
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 <stdio.h> #include <stdlib.h> #include <malloc.h> 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
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。