C语言结构体使用之链表
1. 链表的定义
链表是一种动态数据结构,它由若干个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
链表可以分为单链表、双向链表和循环链表几种形式,这里我主要介绍单链表的使用。
2. 链表的声明
链表的声明需要定义链表节点的数据类型,链表的头指针以及一些和链表相关的操作函数。具体代码如下:
//定义链表节点的数据类型
typedef struct node{
int data;
struct node *next;
}Node;
//定义链表头指针
typedef struct list{
Node *head;
int length;
}List;
//定义链表相关的操作函数
void initList(List *list);
void addNode(List *list, int data);
void deleteNode(List *list, int data);
void printList(List *list);
3. 链表的初始化
链表的初始化需要分配一个头节点,并将头指针指向该节点。链表的长度初始为0。
void initList(List *list){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
list->head = head;
list->length = 0;
}
4. 链表的插入
链表的插入可以分为头插法和尾插法两种方式。由于头插法比较简单,这里我只讲解头插法的使用。
void addNode(List *list, int data){
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = list->head->next;
list->head->next = newNode;
list->length++;
}
5. 链表的删除
链表的删除可以根据数据元素的值或者节点的位置进行操作,这里我只讲解根据数据元素进行删除的方式。
删除的过程需要找到该节点的前驱节点,将前驱节点的指针指向该节点的后继节点,并释放该节点的内存。
void deleteNode(List *list, int data){
Node *p = list->head->next;
Node *pre = list->head;
while(p != NULL && p->data != data){
pre = p;
p = p->next;
}
if(p == NULL){
printf("不存在该节点\n");
}else{
pre->next = p->next;
free(p);
list->length--;
}
}
6. 链表的遍历
链表的遍历需要从头节点开始遍历,直到遇到NULL节点截止。在遍历的过程中可以输出节点的数据元素。
void printList(List *list){
Node *p = list->head->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
7. 链表的使用示例
下面是一个使用链表进行排序的示例程序。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}Node;
typedef struct list{
Node *head;
int length;
}List;
void initList(List *list);
void addNode(List *list, int data);
void deleteNode(List *list, int data);
void printList(List *list);
void sortList(List *list);
void initList(List *list){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
list->head = head;
list->length = 0;
}
void addNode(List *list, int data){
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = list->head->next;
list->head->next = newNode;
list->length++;
}
void deleteNode(List *list, int data){
Node *p = list->head->next;
Node *pre = list->head;
while(p != NULL && p->data != data){
pre = p;
p = p->next;
}
if(p == NULL){
printf("不存在该节点\n");
}else{
pre->next = p->next;
free(p);
list->length--;
}
}
void printList(List *list){
Node *p = list->head->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void sortList(List *list){
Node *p = list->head->next;
int i, j, len = list->length;
int temp;
for(i=0; i<len-1; i++){
p = list->head->next;
for(j=0; j<len-i-1; j++){
if(p->data > p->next->data){
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next;
}
}
}
int main()
{
int a[10] = {5, 2, 4, 3, 1, 7, 8, 9, 6, 0};
List list;
initList(&list);
for(int i=0; i<10; i++){
addNode(&list, a[i]);
}
printf("排序前的链表:");
printList(&list);
sortList(&list);
printf("排序后的链表:");
printList(&list);
return 0;
}
以上就是关于C语言结构体使用之链表的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言结构体使用之链表 - Python技术站