求写C语言 创建链表实例子。要最基本的 包括注释。

 我来答
田风子风v
推荐于2016-10-05 · TA获得超过192个赞
知道小有建树答主
回答量:179
采纳率:0%
帮助的人:124万
展开全部

题目:创建固定长度的单向链表


程序分析:链表是动态分配存储空间的链式存储结构,

其包括一个“头指针”变量,其中第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=1;i<=n;i++)
{
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;/*指向下一个结点*/
}
}
xoaxa
2014-12-11 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3443万
展开全部
#include <stdio.h>
#include <malloc.h>

typedef int datatype;

typedef struct node { // 结点数据类型声明
datatype info;
struct node *next;
}NODE;

void show(NODE *head) { // 有头结点循环链表的显示
NODE *p;
for(p = head->next; p != head; p = p->next)
printf("%d ",p->info);
printf("\n");
}

NODE *josefnode(int n) { // 创建有头结点的n个结点的单向循环链表
int i;
NODE *p, *head;
head = p = (NODE *)malloc(sizeof(NODE)); // 首先生成头结点
head->info = 0; // 头结点的数据域初始化为0,非必要
for(i = 0; i < n; ++i) {
p->next = (NODE *)malloc(sizeof(NODE)); // 得到新结点存储空间
p->next->info = i + 1; // 给新结点数据域赋值
p = p->next; // 移动指针
}
p->next = head; // 尾结点的next指向头结点(head)
return head; // 返回头结点地址
}

// 报名出列代码,有些难度
void josef(int n) { // 
int cnt = 0;
NODE *h, *p, *q;
h = p = josefnode(n); // 获取链表
show(h); // 显示链表信息
while(h->next != h) { // 循环点名代码,直到有效结点个数为0
if(p->next == h) p = p->next; // 遇到头结点则跳过
++cnt; // 点名计数器增1
if(cnt % 3 == 0) { // 满足3的倍数时
q = p->next; // q指向该结点
printf("%d ",q->info); // 显示该结点数据
p->next = q->next; // 计数指针移到下一个结点
free(q); // 删除结点
}
else p = p->next; // 非3 的整数倍时,继续
}
printf("\n");
free(h); // 释放头结点
h = NULL;
}

void main() {
int n;
printf("请输入人数:");
scanf("%d", &n);
josef(n);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式