单链表(c语言实现)

来源:互联网 发布:cf for mac版 编辑:程序博客网 时间:2024/06/08 19:23

List.h

#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int DataType;typedef struct ListNode{DataType data;struct ListNode *next;}ListNode;void PrintList(ListNode *pList);//从头到尾打印void PushBack(ListNode **ppList, DataType x);//尾插void PopBack(ListNode **ppList);//尾删void PushFront(ListNode **ppList, DataType x);//头插void PopFront(ListNode **ppList);//头删ListNode *Find(ListNode *pList, DataType x);//查找void Insert(ListNode **ppList, ListNode *pos, DataType x);//指定位置前插入void Erase(ListNode **ppList, ListNode *pos);//删除指定位置

List.c

#define _CRT_SECURE_NO_WARNINGS 1#include "List.h"ListNode *CreatNode(DataType x)//创建节点{ListNode *tmp = (ListNode*)malloc(sizeof(ListNode));if(tmp == NULL){printf("创建节点失败!\n");return NULL;}tmp->data = x;tmp->next = NULL;return tmp;}void PrintList(ListNode *pList)//打印{while(pList){printf("%d->", pList->data);pList = pList->next;}printf("NULL\n");return;}void PushBack(ListNode **ppList, DataType x)//尾插{//1.没有节点//2.有一个节点//3.有多个节点if((*ppList) == NULL){*ppList = CreatNode(x);}else if((*ppList)->next == NULL){(*ppList)->next = CreatNode(x);}else{ListNode *tmp = *ppList;while(tmp->next){tmp = tmp->next;}tmp->next = CreatNode(x);}}void PopBack(ListNode **ppList)//尾删{//1.没有节点//2.有一个节点//3.有多个节点if(*ppList == NULL){return;}else if((*ppList)->next == NULL){free(*ppList);*ppList = NULL;}else{ListNode *tmp = *ppList;ListNode *pre = *ppList;while(tmp->next){pre = tmp;tmp = tmp->next;}free(tmp);pre->next = NULL;}}void PushFront(ListNode **ppList, DataType x)//头插{//1.没有节点//2.有节点if(*ppList == NULL){*ppList = CreatNode(x);}else{ListNode *tmp = CreatNode(x);tmp->next = *ppList;*ppList = tmp;}}void PopFront(ListNode **ppList)//头删{//1.没有节点//2.有一个节点//3.有多个节点if(*ppList == NULL){return;}else if((*ppList)->next == NULL){free(*ppList);*ppList = NULL;}else{ListNode *tmp = (*ppList)->next;free(*ppList);*ppList = tmp;}}ListNode *Find(ListNode *pList, DataType x)//查找{while(pList){if(pList->data == x){return pList;}pList = pList->next;}return pList;}void Insert(ListNode **ppList, ListNode *pos, DataType x)//指定位置前插入{ListNode *tmp = CreatNode(pos->data);assert((*ppList)&&(pos));if(tmp != NULL){if(pos->next == NULL){pos->data = x;pos->next = tmp;*ppList = pos;}else{pos->data = x;tmp->next = pos->next;pos->next = tmp;}}}void Erase(ListNode **ppList, ListNode *pos)//删除指定位置{assert((*ppList)&&(pos));if((*ppList == pos)){*ppList = pos->next;free(pos);}else{ListNode *tmp = *ppList;while(tmp->next != pos){tmp = tmp->next;}tmp->next = pos->next;free(pos);}}

test.c

#include "List.h"void test1()//测试PushBack/PopBack{ListNode *List = NULL;PushBack(&List, 1);PushBack(&List, 2);PushBack(&List, 3);PushBack(&List, 4);PrintList(List);PopBack(&List);PopBack(&List);PrintList(List);PopBack(&List);PopBack(&List);PrintList(List);}void test2()//测试PushFront/PopFront{ListNode *List = NULL;PushFront(&List, 4);PushFront(&List, 3);PushFront(&List, 2);PushFront(&List, 1);PrintList(List);PopFront(&List);PopFront(&List);PrintList(List);PopFront(&List);PopFront(&List);PrintList(List);}void test3()//测试Insert/Erase{ListNode *List = NULL;ListNode *ret = NULL;PushBack(&List, 1);PushBack(&List, 2);PushBack(&List, 3);PushBack(&List, 4);PrintList(List);ret = Find(List, 1);Insert(&List, ret, 0);PrintList(List);ret = Find(List, 4);Erase(&List, ret);PrintList(List);}int main(){test1();test2();test3();return 0;}

如有不对之处,欢迎留言指正。

原创粉丝点击