本节:使用C语言实现单链表的创建、指定位置插入数据、顺序循环遍历、指定位置删除数据、指定位置查询数据。启用头结点作为开始节点,即作为第一节点,由于头结点无前驱节点,故在操作上需要特殊处理。
main.c文件
//
// main.c
// learn
//
// Created by shang wang on 2021/7/10.
//
#include <stdio.h>
#include "link.h"
int main(int argc, const char * argv[]) {
int flag = 0;
Element result = 0;
// insert code here...
T_link *s=NULL;
s=pInitLink();
if(s==NULL)
{
printf("s is NULL\n");
}
flag = push(s, 1, 1);
printf("push %d result %d\n", 1, flag);
flag = push(s, 2, 2);
printf("push %d result %d\n", 2, flag);
flag = push(s, 3, 500);
printf("push %d result %d\n", 500, flag);
flag = push(s, 1, 501);
printf("push %d result %d\n", 501, flag);
flag = ergodic(s);
printf("ergodic result is %d, link size %d\n", flag, s->size);
flag = delete(s, 1);
printf("delete result is %d, link size %d\n", flag, s->size);
flag = ergodic(s);
printf("ergodic result is %d, link size %d\n", flag, s->size);
result = query(s, 1);
printf("query result is %d, link size %d\n", result, s->size);
return 0;
}
link.h文件
//
// link.h
// learn
//
// Created by shang wang on 2021/7/10.
//
#ifndef link_h
#define link_h
#include <stdio.h>
typedef int Element;
typedef enum{
false,
true,
}Status;
typedef struct node{
Element data;
struct node *pNext;
}T_node, *P_node;
typedef struct link{
T_node *head;
Element size;
}T_link, *P_link;
//单链表创建
T_link *pInitLink(void);
//单链表插入
Status push(T_link *pLink, int n, Element value);
//单链表顺序遍历
Status ergodic(T_link *pLink);
//链表删除
Status delete(T_link *pLink, int n);
//链表查询
Element query(T_link *pLink, int n);
#endif /* link_h */
link.c文件
//
// link.c
// learn
//
// Created by shang wang on 2021/7/10.
// 单链表创建 插入 删除 查询 遍历 翻转 合并 检测环 删除倒数第几个节点 求链表中间点 求有没有环
#include "link.h"
#include "stdio.h"
#include <stdlib.h> //malloc
//工具函数
//单链表创建,使用了头结点,头结点是第一个节点。插入第一节点位置无前驱节点,特殊处理。
T_link *pInitLink()
{
T_link *pLink = (T_link *)malloc(sizeof(T_link));
if(pLink == NULL){
return NULL;
}
T_node *pNode = (T_node *)malloc(sizeof(T_node));
if (pNode == NULL) {
return NULL;
}
pNode->data=0;
pNode->pNext=NULL;
pLink->size=1; //第一个节点使用
pLink->head=pNode;
return pLink;
}
//单链表插入
Status push(T_link *pLink, int n, Element value)
{
int i=1;
if(pLink==NULL||n<1){
return false;
}
if(n<1||n>pLink->size){
n=pLink->size;
}
T_node *pCurrent=pLink->head;
while (i < (n-1)) { //头结点被使用,头结点无前驱节点。计算前驱节点的for循环终止条件减1
pCurrent = pCurrent->pNext;
i++;
}
T_node *pNewNode = (T_node *)malloc(sizeof(T_node));
if(pNewNode == NULL){
return false;
}
// printf("%d\n", pNewNode);
if (n==1) {
pNewNode->pNext=pCurrent;
pLink->head=pNewNode; //插入链表头部,即第一个节点
}else{
pNewNode->pNext=pCurrent->pNext;
pCurrent->pNext=pNewNode; //插入链表其他位置
}
pNewNode->data=value;
pLink->size++;
return true;
}
//单链表顺序遍历
Status ergodic(T_link *pLink)
{
int i=0;
if(pLink==NULL||pLink->size==0)
{
printf("link is NULL or link is Emty\n");
return false;
}
T_node *pCurrent=pLink->head;
for (i=0;i<pLink->size;i++) {
printf("No.%d is %d\n",i+1, pCurrent->data);
pCurrent=pCurrent->pNext;
}
return true;
}
//链表删除
Status delete(T_link *pLink, int n)
{
int i=1;
if (pLink==NULL||n<1) {
return false;
}
T_node *pCurrent=pLink->head;
while (i<(n-1)) {
pCurrent=pCurrent->pNext;
i++;
}
T_node *pTempNode = NULL;
if (n==1) {
pTempNode = pCurrent;
pLink->head=pTempNode->pNext;
}else{
pTempNode = pCurrent->pNext;
pCurrent->pNext=pTempNode->pNext;
}
pLink->size--;
free(pTempNode);
return true;
}
//链表查询
Element query(T_link *pLink, int n)
{
int i=1;
if(pLink==NULL||n<1)
{
return false;
}
T_node *pCurrent=pLink->head;
while (i<(n-1)) {
pCurrent=pCurrent->pNext;
i++;
}
if (n==1) {
return pCurrent->data;
}else{
return pCurrent->pNext->data;
}
}