通过结构体指针将结构体变量与结构体变量连接起来的线性表称为链表。
一、创建链表
(一)结构体指针
struct Node{
int data; //数据域
struct Node *next; //指针域
};
(二)将结构体指针变为结构体变量——动态内存申请
struct Node* createList(){
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
//HeadNode就成为了一个结构体变量
headNode->next=NULL;//将变量初始化
return headNode;
}
二、创建结点
struct Node* createNode(int data){
struct Node* newNode = (struct Node*)malloc(struct Node);
newNode->data = data;
newNode->next = NULL;
return newNode;
}
三、插入结点
(一)头插法
//参数为插入的链表以及数据
void insertNodeByHead(struct Node* headNode, int data){
struct Node* newNode=createNode(data);
//顺序不可颠倒,否则会导致newNode->next=newNode
newNode->next=headNode->next;
headNode->next=newNode;
}
(二)尾插法
void insertNodeByTail(struct Node*tailNode, int data){
struct Node* newNode=createNode(data);
tailNode->next=newNode;
tailNode=newNode;
}
三、打印(遍历)结点
void print(struct headNode* List){
struct Node* pMove=headNode->next;//从第二个结点开始,头结点一般没有数据
while(pMove){
printf("%d",pMove->data);
pMove=pMove->next;
}
printf("\n");
}
四、删除结点(指定位置删除)
void deleteNode(struct Node* headNode,int pData){
struct Node* p=headNode->next;
struct Node* pFront=headNode;
if(p->data==NULL)
printf("链表为空!\n");
else{
while(p->data!=pData){
pFront=p;
p=p->next;
if(p==NULL){
printf("未找到该数据!\n")
return;
}
pFront->next=p->next;
free(p);
}
}