zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【C语言】链表的使用及链表的实现原理

2023-04-18 15:53:48 时间

链表是什么?

1.逻辑结构上⼀个挨⼀个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。

2.由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要 配备⼀个指针,⽤于指向它的直接后继元素,即每⼀个数据元素都指向下⼀个数据元素

** 本身的信息,称为“数据域” ** ** 指向直接后继的指针,称为“指针域”。指向NULL(空))。

下面是一个单链表的实现过程

#include 
#include 
#include                  //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰的数据类型
typedef struct
{
 char Num[10];//学号
 char Name[20];//姓名
} Student;

typedef struct tagNode     				
{                                        
 Student Stu;             			
 struct tagNode *pNext;  		
} Node;

//定义链表的第⼀个学⽣,即学⽣单链表的头结点

Node *head = NULL;  
void printfNode()                                           //遍历元素
{
 Node *node = head;   //为了不去破坏那个本来的head,重新定义一个node指针变量。
 while(node !=NULL)
 {
 printf("Num:%s,Name:%s
",node->Stu.Num,node->Stu.Name);
 node = node->pNext;    //node等于下一个节点,一直遍历下去
 }
}

void addNode(Node *node)      
{                
 node->pNext = NULL;    //如果只是一个Node,那就是一个元素,你只知道他的数据,并不知道怎么去访问这个数据
    
 if(head == NULL)
 {
 head = node;    //一开始没有任何节点,那么传入的节点作为头结点
 }
    
 else
 {
 Node *p = head;                          
     
 while(p != NULL && p->pNext !=NULL)       //,获取最后一个节点的位置,跳出循环的那时候是最后一个节点,判断后继节点是否为空
 {
 p = p->pNext;
 }
 p->pNext=node;      //下一个指针域指向新节点

 }
}

int main()
{
 Node *p1 = (Node*)malloc(sizeof(Node));    //malloc在  里面,给p1分配一个内存。  这里p1换成node输出一样
 strcpy(p1->Stu.Num,"123");    //给p1赋值
 strcpy(p1->Stu.Name,"louis");
 Node *p2 = (Node*)malloc(sizeof(Node));
 strcpy(p2->Stu.Num,"124");
 strcpy(p2->Stu.Name,"daniel");
 Node *p3 = (Node*)malloc(sizeof(Node));
 strcpy(p3->Stu.Num,"125");
 strcpy(p3->Stu.Name,"xd");
 addNode(p1);
 addNode(p2);
 addNode(p3);
 printfNode();
 return 0;
}

输出:

Num:123,Name:louis
Num:124,Name:daniel
Num:125,Name:xd