#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct _node
{
int data;
struct _node *next;
}Node;
Node *initLinkedList();//初始化链表
Node *createNode(int data);//创造链表节点
int insertByHead(Node *headNode,int data);//头插法
int insertByTail(Node *headNode,int data);//尾插法
void displayAll(Node *headNode);//显示链表所有元素
int getLength(Node *headNode);//获得链表长度,有多少个元素
int insert(Node *headNode,int pos,int data);//按照位置插入
int delNode(Node *headNode,int pos);//删除链表中的节点
int cleanLinkedList(Node *headNode);//清空链表
int main(int argc, char **argv)
{
Node *node = initLinkedList();
insertByTail(node,10);
insertByTail(node,20);
insertByTail(node,30);
insertByTail(node,40);
displayAll(node);
printf("length:%d\n",getLength(node));
delNode(node,0);
displayAll(node);
printf("length:%d\n",getLength(node));
}
/******************************
* 功能 删除链表中的节点
* 返回 int
* 输入 链表头节点 删除的位置
* ******************************/
int delNode(Node *headNode,int pos){
if(pos <= 0 || pos > getLength(headNode)) return FALSE;
Node *p = headNode;
Node *q;
int i = 1;
for(i;i<pos;i++){
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);
return TRUE;
}
/******************************
* 功能 清空单链表中的所有元素
* 返回 int
* 输入 链表的头节点
* ***************************/
int cleanLinkedList(Node *headNode){
if (headNode->next == NULL) return FALSE;
Node *p=headNode,*q;
while (p->next)
{
q = p->next;
p->next = q->next;
free(q);
}
return TRUE;
}
/***********************
* 功能 初始化链表,建立链表的头指针
* 返回 返回链表的头指针
* 输入 void
* *************************/
Node *initLinkedList(){
Node *headNode = (Node *)malloc(sizeof(Node));
headNode->next = NULL;
return headNode;
}
/*************************
* 功能 建立链表节点
* 返回 含有数据的新节点
* 输入 int
* **********************/
Node *createNode(int data){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
/*****************************
* 功能 头插法插入链表元素
* 返回 int
* 输入 链表头节点,数据
* **************************/
int insertByHead(Node *headNode,int data){
if (headNode == NULL) return FALSE;
Node *newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
return TRUE;
}
/********************************
* 功能 尾插法插入链表元素
* 返回 int
* 输入 链表头节点,数据
* *****************************/
int insertByTail(Node *headNode,int data){
if (headNode == NULL) return FALSE;
Node *newNode = createNode(data);
Node *p = headNode;
while(p->next!=NULL){
p=p->next;
}//找到最后一个节点
p->next = newNode;
return TRUE;
}
/*******************************
* 功能 显示链表所有元素
* 返回 void
* 输入 链表头节点
* ****************************/
void displayAll(Node *headNode ){
Node *p = headNode->next;
int i = 1;
while (p!=NULL)
{
printf("第 %d 个 元素: %d\n",i,p->data);
p = p->next;
i++;
}
}
/**********************************
* 功能 获得链表长度,链表有多少个节点
* 返回 int
* 输入 链表头节点
* **********************************/
int getLength(Node *headNode){
int i = 0;
Node *p = headNode->next;
while (p!=NULL)
{
p = p->next;
i++;
}
return i ;
}
/**********************
* 功能 按照位置插入节点
* 返回 int
* 输入 链表头节点 位置 数据
* **********************/
int insert(Node *headNode,int pos,int data){
if(headNode->next==NULL) return FALSE;
if(pos <= 0 || pos > getLength(headNode) + 1 ) return FALSE;
int i = 1;
Node *p = headNode;
Node *newNode = createNode(data);
for(i;i<pos;i++){
p = p->next;
}
newNode->next = p->next;
p->next = newNode;
}
C语言实现带头节点的单链表
最新推荐文章于 2023-12-10 12:42:39 发布