题目:创建固定长度的单向链表
程序分析:链表是亏好动态分配存储空间的链式存储结构,
其包括一个“头指针”变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址。
链表中销孝铅每一个元素称为“结点”,每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域。指针域中存储的即是链表的下一个结点存储位置,是一个指针。多个结点链接成一个链表。
最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没有后继结点。
使用结构体变量作为链表中的结点,因为结构体变量成员可以是数值类型,字符类型,数组类型,也可以是指针类型,这样就可以使用指针类型成员来存放下一个结点的地址,使其它类型成员存放数据信息。
在创建列表时要动态为链表分配空间,C语言的库函数提供了几种函数实现动态开辟存储单元。
malloc()函数实现动态开辟存慎液储单元:
malloc函数原型为:void *malloc(unsigned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间,函数返回值是一个指向分配域起始地址的指针(类型为void)。如果分配空间失败(如,内存空间不足),则返回空间指针(NULL)
#include<stdio.h>#include<malloc.h>
struct LNode
{
int data
struct LNode *next
}
/*上面只是定义了一个结构体类型,并未实际分配内存空间
只有定义了变量才分配内存空间*/
struct LNode *creat(int n)
{
int i
struct LNode *head,*p1,*p2
/*head用来标记链表,p1总是用来指向新分配的内存空间,
p2总是指向尾结点,并通过p2来链入新分配的结点*/
int a
head=NULL
for(i=1i<=ni++)
{
p1=(struct LNode *)malloc(sizeof(struct LNode))
/*动态分配内存空间,并数据转换为(struct LNode)类型*/
printf("请输入链表中的第%d个数:",i)
scanf("%d",&a)
p1->data=a
if(head==NULL)/*指定链表的头指针*/
{
head=p1
p2=p1
}
else
{
p2->next=p1
p2=p1
}
p2->next=NULL/*尾结点的后继指针为NULL(空)*/
}
return head/*返回链表的头指针*/
}
void main()
{
int n
struct LNode *q
printf("请输入链表的长度:/n")
scanf("%d",&n)
q=creat(n)/*链表的头指针(head)来标记整个链表*/
printf("/n链表中的数据:/n")
while(q)/*直到结点q为NULL结束循环*/
{
printf("%d ",q->data)/*输出结点中的值*/
q=q->next/*指向下一个结点*/
}
}
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct 春吵node {
unsigned id // 学号
char name[20]
double score
struct node *next
}*LinkList, 竖局*pNode
LinkList GetEmptyList() {
LinkList head = (pNode)malloc(sizeof(struct node))
head->next = NULL
return head
}
void AddData(LinkList head,pNode newnode) {
newnode->next = head->next
head->next = newnode
}
void Show(LinkList head) {
pNode p = head->next
while(p) {
printf("%u\t%s\t%.2lf\n",p->id,p->name,p->score)
p = p->next
}
printf("\n")
}
int main() {
unsigned id
char name[20]
double score
pNode newnode
LinkList head = GetEmptyList()
printf("学号 姓名 分数('q' to quit):")
while(scanf("%u%s%lf",&id,name,&score) == 3) {
newnode = (pNode)malloc(sizeof(struct node))
newnode->id = id
newnode->score = score
strcpy(newnode->name,name)
AddData(head,newnode)
printf("学号 姓名 分数('q'扒纤侍 to quit):")
}
printf("链表数据为:\n")
Show(head)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)