#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next; //节点的指针域
} ListNode;
typedef ListNode LinkList;//带头节点的单链表
//初始化单链表只有头节点
void InitLinkList(LinkList *linklist) {
linklist->next = NULL;
linklist->data = 0;
}
//创建一个单链表
LinkList *CreateLinkList() {
LinkList *linklist = NULL;
//分配链表的内存空间,若失败则返回空
if ((linklist = (LinkList*)malloc(sizeof(LinkList))) == NULL)
return NULL;
else {
InitLinkList(linklist);
return linklist;
}
}
/**
ListNode *GetNode(LinkList *linklist, int position)
参数:
LinkList:指向一个单链表的指针;position:指定的返回节点
返回值:
若存在指定节点则返回,否则返回NULL
功能:
返回指定的节点
*/
ListNode *GetNode(LinkList *linklist, int position ) {
if (linklist == NULL)
return NULL;
if (position >= 0) {
int pos = 0;
ListNode *pNode = linklist;
while (pos < position) {
pos++;
if (pNode->next != NULL)
pNode = pNode->next;
else
return NULL;
}
return pNode;//返回指定节点
}
return NULL;
}
/**
ListNode *DeleteNode(LinkList *linklist, int position)
参数:
LinkList:指向一个单链表的指针;position:需要删除的节点
返回值:
若存在指定节点则返回,否则返回NULL
功能:
删除指定的节点
*/
ListNode *DeleteNode (LinkList *linklist, int position) {
if (linklist == NULL) {
printf("链表为空!");
return NULL;
}
if (position <= 0) {
printf("删除节点位置非法!");
return NULL;
}
int pos = 0; // this is a flag to find the specific position
ListNode *pNode = linklist; //the head of linklist
while (pos < position) {
pNode = pNode->next;
if (pNode == NULL) //OverFlow, return NULL
return NULL;
pos++;
}
// remove the specific Node
ListNode *prevNode = GetNode(linklist, position - 1);
prevNode->next = pNode->next;
free(pNode);
return pNode;
}
/**
void ClearAll(LinkList *linklist)
参数:
ListNode:指向一个单链表的指针
返回值:
无
功能:
清空整个链表
*/
void ClearAll(ListNode *linklist) {
ListNode *pNode = linklist;
ListNode *nNode = NULL;
while (pNode->next != NULL) {
nNode = pNode->next;
pNode->next = nNode->next;
free(nNode);
}
}
/**
void FinitLinkList(LinkList *linklist)
参数:
LinkList:指向一个单链表头结点的指针
返回值:
无
功能:
解初始化链表
注意:
使用InitLinkList创建的链表要使用FinitLinkList来解初始化
*/
void FinitLinkList (LinkList *linklist) {
if (linklist == NULL)
printf("该链表不存在!");
else
free(linklist);
}
ListNode *GetTail(LinkList *linklist) {
if (linklist == NULL)
return NULL;
ListNode *pNode = linklist;
while (pNode->next != NULL)
pNode = pNode->next;
return pNode;
}
/**
int InsertNodeAt (LinkList *linklist, int data, int position)
参数:
LinkList: 指向一个单向链表头结点的指针
data: 要插入的数据
position: 数据插入的目标位置
返回值:
插入成功返回1,插入失败返回-1;
功能:
向指定位置插入数据
*/
int InsertNodeAt (LinkList *linklist, int data, int position) {
if (linklist == NULL) {
return -1;
}
ListNode *pNode = GetNode(linklist, position - 1);
//to check whether position is overflow
if (pNode == NULL && position != 0)
return -1;
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = pNode->next;
pNode->next = newNode;
return 1;
}
/**
int InsertHead (LinkList *linklist, int data)
参数:
LinkList: 指向一个单向链表头结点的指针
data: 要插入的数据
返回值:
插入成功返回1,插入失败返回-1;
功能:
插入新的头节点
*/
int InsertHead(LinkList *linklist, int data) {
if (linklist == NULL)
return -1;
ListNode *pNode = linklist;
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode == NULL)
return -1;
newNode->data = data;
printf("**%d**\n", newNode->data);
newNode->next = pNode->next;
pNode->next = newNode;
return 1;
}
int InsertTail(LinkList *linklist, int data) {
if (linklist == NULL)
return -1;
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
if (newNode == NULL)
return -1;
newNode->data = data;
LinkList *pNode = linklist;
while (pNode->next != NULL)
pNode = pNode->next;
pNode->next = newNode;
newNode->next = NULL;
return 1;
}
//输出链表
void PrintLinkList(LinkList *linklist) {
ListNode *pNode = linklist;
if (pNode == NULL) {
printf("链表不存在!");
}
else {
while (pNode != NULL) {
printf("%d\n", pNode->data);
pNode = pNode->next;
}
}
}
/**
void PrintNode(ListNode *pNode)
参数:
pNode指向目标结点的指针
返回值:
无
功能:
输出指定结点的数据
*/
void PrintNode(ListNode *pNode) {
printf("%d\n", pNode->data);
}
int main(void) {
LinkList *linklist = CreateLinkList();
for (int i=0; i<5; i++) {
InsertTail(linklist, i);
}
PrintLinkList(linklist);
ListNode *pNode = GetNode(linklist, 1);
PrintNode(pNode);
printf("*****************************\n");
InsertNodeAt(linklist, 10, 3);
PrintLinkList(linklist);
printf("*****************************\n");
if ( InsertHead(linklist, 44) == -1)
printf("插入失败!\n");
if (InsertTail(linklist, 33) == -1) {
printf("插入失败!\n");
}
PrintLinkList(linklist);
printf("******************************\n");
DeleteNode(linklist, 1);
ClearAll(linklist);
PrintLinkList(linklist);
FinitLinkList(linklist);
}
C语言单向链表实现
最新推荐文章于 2023-06-06 21:42:17 发布