赞
踩
#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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。