单向链表c语言
① c语言单向链表
name 保存在结构体单元的name[20] 数组里;
typedef struct node
{
char name[20];
struct node *link;
}stud;
这是你前面定义的结构体变量,一个单元包含两个部分,一个用来存储name的数组name[20],一个用来存放下一个单元地址的指向结构体node的指针。
假设该单元的地址是p,那么p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一个单元的地址。
--------------》你看不懂的部分如下《-----------------
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
在这段代码前面是分配一个结构体单元空间,s是这个新分配空间的地址,p是链表的尾节点的地址,以链表形式说,新分配的应当跟在它后面。
按上面所讲,p->link用来存放下一单元的地址,因此有:
p->link=s; 这样新节点就成为链表的一部分了。
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
这两句,是对将需要输入的名字读入并且存放在新节点用于存放name 的数组中。
此时,刚开辟的新节点成了尾节点,尾节点不指向任何其它节点,因此s->link=NULL;(NULL是空指针)
(C中处理指针需要小心行事)
p=s; 将p变量赋值为s,即让其为尾节点的地址,便于继续添加节点。
② C语言实现一个单向链表linked List
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structnode
{
intdata;
structnode*next;
};
intmain()
{
structnode*h=NULL,*p;
inti;
ints1,s2,s3;
srand(time(NULL));
for(i=0;i<5;i++)
{
if(h==NULL)
h=p=(structnode*)malloc(sizeof(structnode));
else
p=p->next=(structnode*)malloc(sizeof(structnode));
p->data=rand()%10+1;
}
p->next=NULL;
s1=s2=s3=0;
for(p=h;p;p=p->next)
{
if(p->data%2==1)s1+=p->data;
elses2+=p->data;
s3+=p->data;
}
printf("all=%dodd=%deven=%d ",s3,s1,s2);
while(h)
{
p=h->next;
free(h);
h=p;
}
return0;
}
③ C语言单链表
C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("请输入第1个数据:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",&n);
create(n);
}
④ 求问c语言单向链表和双向链表与循环链表的区别
打个比方。把链表节点看作是一个人,把链表指针看作是人的手(左手是前向指针,右手是后向指针)。
非循环的单向链表是这样的:若干个人排成一排,每个人都抬起右手指向他右边的人,最右边的人的右手指向了空气(NULL)。如果要想找到这一排中任意一个人,必须从排头(链表头)开始沿手指的方向挨个查找。
循环单向链表是这样的:若干个人围成一圈,每个人都抬起右手指向他右边的人,这样每个人的右手都能指到一个人(如果只有一个人,那么他的右手指向自己)。从任意一个人开始,沿着手指的方向,可以不停地循环找到每一个人。
非循环的双向链表是这样的:若干个人排成一排,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,那么最左边的人的左手指向了空气(NULL),最右边的人的右手指向了空气(NULL)。如果要想找到这一排中某个目标人,从任意一个人开始,可以沿左手方向尝试查找,如果找不到,可以继续沿右手方向查找,直到找到目标人。
循环双向链表是这样的:若干个人围成一圈,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,这样每个人的左右手都可以指到一个人(如果只有一个人,那么他的左右手都指向自己)。无论选择左手方向还是右手方向,都可以不停地循环找到每一个人。
⑤ 用C语言编程(创建一个单向链表)
设计程序
创建一个
单向链表
,并输出链表中数据。要求:从键盘
输入数据
元素个数
和值
,并在此基础上实现单
⑥ C语言 单向链表如何排序
void link_order(STU *p_head)
{
STU *pb, *pf, temp;
pf = p_head;
if(p_head == NULL) {//链表为空
printf("needn't order. ");
return ;
}
if(p_head->next == NULL) {//链表有1个节点
printf("only one print, needn't order. ");
return ;
}
while(pf->next != NULL) {//以pf指向的节点为基准节点
pb = pf->next;//pb从基准点的下一个节点开始
while(pb != NULL) {
if(pf->num > pb->num) {
temp = *pf;
*pf = *pb;
*pb = temp;
temp.next = pf->next;
pf->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;
}
pf = pf->next;
}
return ;
}
(6)单向链表c语言扩展阅读:
链表的排序有三种情况:
1、链表为空时:不用排序;
2、链表中有一个节点:不用排序;
3、链表中两个及其以上节点时:排序。
return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。