c语言链表详解超详细?
C语言链表是由节点(有时也称作元素或数据项)组成的一系列结构,每个节点储存有一个值和一个指向另外一个节点的指针。这种数据结构使得你可以动态地添加数据,不用在开始就确定好它们的个数。
1. 基本概念:
链表是一种特殊的线性表,它的特性是有序,但不是通过下标来访问,而是采用的链式存储,它的元素由一个个有序的链组成,链结构中的每个结点由数据域和指针域构成。在添加新数据的时候,将新节点的指针指向当前节点,然后把新节点的指针改为指向之前的节点,就完成了新节点的添加,并且不会影响原有链表上其他节点的排列。
2. 链表遍历:
遍历链表很简单,按照节点逐个访问即可。具体来说,每次均与链表的开头节点相连接,然后利用指针的指向找到下一个节点,直到当前指针为空,表示访问完毕。
3. 链表的应用:
链表是经常用到的数据结构,它可以用在多种场景。比如:
(1)网络路由协议通常用链表来存储数据,更新路径时用链表来操作;
(2)操作系统内存管理系统用链表来实现;
(3)使用链表可以高效地解决各种问题,比如LeetCode上的链表操作。
反正,链表是一种简单好用的数据结构,广泛应用于各种场景,熟悉它会提高编程效率。
C语言单向链表中如何往文件里存入数据和读取数据?
花了我半个小时,给了写了一个简单的例子,以下是在vs2005下调试成功,test.txt为文件名,在当前目录下。
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct Node
{
int num;
int score;
struct Node* next;
}Node, *Linklist;
void InitLinklist(Linklist* L) //初始化单链表,建立空的带头结点的链表
{
*L = (Node*)malloc(sizeof(Node));
(*L)->next = NULL;
}
void CreateLinklist(Linklist L) //尾插法建立单链表
{
Node *r, *s;
r = L;
int iNum, iScore;
printf(“Please input the number and score:n”);
scanf(“%d”,&iNum);
scanf(“%d”,&iScore);
while(0 != iScore) //当成绩为负时,结束输入
{
s = (Node*)malloc(sizeof(Node));
s->num = iNum;
s->score = iScore;
r->next = s;
r =s;
printf(“Please input the number and score:n”);
scanf(“%d”,&iNum);
scanf(“%d”,&iScore);
}
r->next = NULL; //将最后一个节点的指针域置为空
}
int WriteLinklistToFile(const char* strFile, Linklist L)
{
FILE *fpFile;
Node *head = L->next;
if(NULL == (fpFile = fopen(strFile,”w”))) //以写的方式打开
{
printf(“Open file failedn”);
return FALSE;
}
while(NULL != head)
{
fprintf(fpFile,”%dt%dn”,head->num,head->score);
head = head->next;
}
if(NULL != fpFile)
fclose(fpFile);
return TRUE;
};
int ReadFromFile(const char* strFile)
{
FILE *fpFile;
if(NULL == (fpFile = fopen(strFile,”r”))) //以读的方式打开
{
printf(“Open file failedn”);
return FALSE;
}
printf(“The contents of File are:n”);
while(!feof(fpFile))
putchar(fgetc(fpFile));//证明fprintf()输出到文件中的绝对是字符串
if(NULL != fpFile)
fclose(fpFile);
return TRUE;
}
void Destroy(Linklist L)
{
Node *head =L;
while (head)
{
Node* temp = head;
head = head->next;
free(temp);
}
}
int main()
{
char* strName = “test.txt”;
Linklist L;
InitLinklist(&L);
CreateLinklist(L);
WriteLinklistToFile(strName, L);
ReadFromFile(strName);
Destroy(L);
return 0;
}
C语言创建双向链表的问题
p的next的prior 的值确实和p一样,这是说值,但是,它们地址是不一样的赋值的时候,等号左边,要研究的是它的地址。p的地址不是说p中保存的地址,而是p本身所在的地址是形参,形参在函数结束以后就没了。p-的next的地址则不同,p的next的地址是p所代表的节点里next成员的地址,同理p的next的prior的地址是”p的下一个节点中,保存的前一个节点的成员“的地址,给它赋值和给p赋值,是不同的。
在C语言中数组和链表有什么区别
两种都属于数据结构的一种,它们的区别如下所示:
1、逻辑结构:数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减元素个数,当数据增加时,可能会超出原先定义的元素个数;当数据减少时,会造成内存浪费。链表动态地进行存储分配,可以适应数据增减,且可以方便插入、删除数据。
2、内存分配:C语言有内存四区,分别为堆区,栈区,代码区,静态区。定义数组时计算机会自动在栈区中申请内存,比较方便,但自由度小。链表从堆中申请内存且必须手动申请,并且手动释放内存,对于程序员来说比较操作
c语言数据结构的问题,用尾插法建立链表
- #includestdio.h#includestdlib.h#includestring.h#define n 100#define elem chartypedef struct node{char a[n];struct node *next;}node,*linklist;void initlink(linklist *p)二级指针,创建一个链表头指针{(*p)=(linklist)malloc(sizeof(node));(*p)-next=NULL;}void creat(linklist L)L为一级指针,也是头指针{int f=1;node *s,*r;r=L;while(f){s=(node*)malloc(sizeof(node));scanf("%s",s-a);if(s-a[0]!=^){r-next=s;r=s;}elsef=0;}}int mai碃涪百皇知郝版酮保捆n(){node *p;linklist l;printf("创建链表n");initlink(&l);printf("请输入:n");creat(l);p=l-next;while(p!=NULL){puts(p-a);p=p-next;}p=l;while(p!=NULL){l=(l)-next;free(p);p=l;}return 0;}编译没有错误,但是在运行的时候,会出现错误。 可以帮我解释第一个子函数么,为什么用一个二级指针。帮忙编译一下,
- void creat(linklist L)L为一级指针,也是头指针{int f = 1;node *s, *r;r = L;while (f) {s = (node*)malloc(sizeof(node));scanf("%s", s-a);if (s-a碃涪百皇知郝版酮保捆[0] != ^) {r-next = s;r = s;}else {f = 0;free(s); 释放 s}}r-next = NULL; 对r设next为NULL}
c语言数据结构链表部分
- 这是因单链表头指针的地址会被改变,所以必须用二级指针
C语言求链表长度(改bug
- ========================typedef struct node{char name[20];struct node *next;}NODE;========================int lenth(NODE *head){NODE *p;int len;for (len = 0, p = head-next; p != NULL; ++len)p = p-next;return(len);}=========================函数和结构体给出,,在主函数中怎么调用并输出结果????我是这么写的,为什么出错???NODE *a;int i;i = lenth(a);printf("链表长度为:%d",i);问题补充: 编译器没报错,但是运行的时候就…………
- 你在主函数中初始化了链表每个节点了么?
C语言链表删除函数问题?
- 当删除节点delete_node == 1的时候有问题, 第一个节点不能正常删除,仍会输出,是为什么
- temp-next = NULL; 加上这句试试free(temp);
C语言链表题
- 目是,输入n个学生的信息,三门功课的成绩(C语言:学号:建立一个新的动态链表!,姓名、数学,(n可以由自己决定容量),身份证号。要求对任何一个字段进行升序或降序排列,必须用链表形式实现!求指教呀、英语)
- net/lsh_2013/article/details/42528429" target="_blank"http.csdn.net/lsh_2013/article/details/42528429具体单链表的概念可以参考a href="http://blog.csdn://blog
C语言链表。
- 建立链表,定义n 输入n个数,再逆着输出。为什么不能正常运行。#includestdio.h#includestdlib.htypedef struct Number{int num;struct Number *next,*previous;}Num,Linklist;void creatlist(Linklist *p,int n);void visit(Linklist *p);int main(){int n;Linklist *p;scanf("%d",&n);p=(Linklist*)malloc(sizeof(Num));p-next=NULL;p-previous=NULL;creatlist(p,n);visit(p);return 0;}void creatlist(Linklist *p,int n){for(;n0;n–){Linklist *s;s=(Linklist*)malloc(sizeof(Num));scanf("%d",s-num);s-next=NULL;p-next=s;s-previous=p;p=s;}p-next=NULL;}void visit(Linklist *p){Linklist *p1; p=p-next;while(p!=NULL){p1=p; p=p-next;}while(p1-previous!=NULL){printf("%d",p1-num);p1=p1-previous;}}
- scanf("%d",&s-num);你的这行没有&.
C语言链表的问题
- 一个结构体的元素指针可以指向另一个结构体的元素指针吗?如。head-〉name=p-〉name
- 只要保存了他的地址,就能指向。。
c语言链表冒泡排序问题
- 这个链表能帮我写个冒泡排序的程序么(按成绩排序)#include stdio.h#include stdlib.h#include malloc.h#define E sizeof(NODE)typedef struct ssxd{char name[15];int nl;double cj;char QQ[15];char sj[15];struct ssxd *pHoat;}NODE , *PNODE;PNODE create_list (void);创建链表void traverse_list (PNODE);遍历链表int main (void){int len;PNODE pHew = NULL;pHew = create_list ();traverse_list (pHew);if (is_empty(pHew))printf("链表为空!n");elseprintf("链表不为空!n");len = length_list (pHew);printf("该链表共记录了%d个学生的信息!n", len);printf("对链表进行排序:");sort_list (pHew);traverse_list (pHew);return 0;}PNODE create_list (void){int len;int i;NODE val;PNODE pHew = (PNODE)malloc(E);if (NULL == pHew){printf("内存分配失败!程序结束!n");exit (-1);}printf("输入学生人数:");scanf("%d", &len);PNODE p = pHew;p-pHoat = NULL;for (i=0; ilen; i++){printf("第%d个学生:n", i+1);printf(" 姓名:");scanf("%s", val.name);printf(" 年龄:");scanf("%d", &val.nl);printf(" 成绩:");scanf("%ld", &val.cj);printf(" QQ:");scanf("%d", val.QQ);printf(" 手机号:");scanf("%d", val.sj);printf("n");PNODE pHat = (PNODE)malloc(E);if (NULL == pHat){printf("内存分配失败!程序结束!n");exit (-1);}*pHat = val;p-pHoat = pHat;pHat-pHoat = NULL;p = pHat;}return pHew;}void traverse_list (PNODE pHew){int i = 1;PNODE p = pHew-pHoat;while (NULL != p){printf("【%d】n", i++);printf(" 姓名:%sn", p-name);printf(" 年龄:%dn", p-nl);printf(" QQ:%dn", p-QQ);printf(" 手机号:%dnn", p-sj);p = p-pHoat;}return ;}
- 链表最好用插入排序,冒泡法实现起来很麻烦!