- 不带头节点的单链表的创建
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef struct { int data; struct LinkList* next; }LinkList; bool InitList(LinkList* L) { L = NULL; //空表,暂时还没有任何节点 return true; } //判断单链表是否为空 bool Empty(LinkList* L) { return (L == NULL); } int main() { LinkList* L; //声明一个指针指向单链表 //初始化一个空表 InitList(&L); return 0; }
- 带头结点的单链表的创建
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef struct { int data; struct LinkList* next; }LinkList; bool InitList(LinkList* L) { L = (LinkList*)malloc(sizeof(LinkList)); //分配一个头节点 if (L == NULL) return false; L->next == NULL; //头结点之后暂时还没有节点 return true; } //判断单链表是否为空(带头结点) bool Empty(LinkList* L) { if (L->next == NULL) return true; else return false; } int main() { LinkList* L; //声明一个指针指向单链表 //初始化一个空表 InitList(&L); return 0; }
- 单链表的基本操作-----按位序插入(带头结点)
//在第i个位置插入元素e(带头结点) bool ListInsert(LinkList* L, int i, int e) { if (i < 1) return false; LinkList* p; //指针p指向当前扫描的结点 int j = 0; //指针p指向的是第几个结点 p = L; //L是指向头结点,头结点是第0个结点(不存数据) while (p != NULL && j < i - 1) { //循环找到第i-1个结点 p = p->next; j++; } if (p == NULL) return false; //i的值不合法 LinkList* cur = (LinkList*)malloc(sizeof(LinkList)); //创建一个新的结点 cur->data = e; cur->next = p->next; //先将cur连到p的下一个结点 p->next = cur; //再将p连到cur,这样就把cur插入进去了 return true; }
- 单链表的基本操作-----按位序插入(不头结点)
//在第i个位置插入元素e(不头结点) bool ListInsert(LinkList* L, int i, int e) { if (i < 1) return false; if (i == 1) { //就是第一个结点的操作与其他的不同 LinkList* cur = (LinkList*)malloc(sizeof(LinkList)); cur->data = e; cur->next = L; L = cur; //头结点指向新结点 return true; } LinkList* p; //指针p指向当前扫描的结点 int j = 1; //此处与带头结点有区别 p = L; //L是指向头结点,头结点是第0个结点(不存数据) while (p != NULL && j < i - 1) { //循环找到第i-1个结点 p = p->next; j++; } if (p == NULL) return false; //i的值不合法 LinkList* cur = (LinkList*)malloc(sizeof(LinkList)); //创建一个新的结点 cur->data = e; cur->next = p->next; //先将cur连到p的下一个结点 p->next = cur; //再将p连到cur,这样就把cur插入进去了 return true; }
- 单链表的基本操作-----指定结点的后插操作
//后插操作:在p结点后插入元素e bool InsertNextNode(LinkList* p, int e) { //时间复杂度O(1) if (p == NULL) return false; LinkList* cur = (LinkList*)malloc(sizeof(LinkList)); if (cur == NULL) return false; //内存分配失败 cur->data = e; cur->next = p->next; p->next = cur; return true; }
- 单链表的基本操作-----指定结点的前插操作
//前插操作:在p结点之前插入元素e bool InsertPriorNode(LinkList* p, int e) { if (p == NULL) return false; LinkList* cur = (LinkList*)malloc(sizeof(LinkList)); if (cur == NULL) return false; //内存分配失败 //前插操作转换为后插,然后给cur和p的元素交换 cur->data = e; cur->next = p->next; p->next = cur; int temp = cur->data; cur->data = p->data; p->data = temp; return true; }
- 单链表的基本操作-----按位序删除(带头结点)
//按位序删除(带头结点) bool ListDelete(LinkList* L, int i, int* e) { if (i < 1) return false; LinkList* p; //指针p指向当前扫描的结点 int j = 0; //指针p指向的是第几个结点 p = L; //L是指向头结点,头结点是第0个结点(不存数据) while (p != NULL && j < i - 1) { //循环找到第i-1个结点 p = p->next; j++; } if (p == NULL) return false; //i的值不合法 if (p->next == NULL) return false; //第i-1个结点后已无其他结点 LinkList* cur = p->next; //令cur指向p的next 结点 *e = cur->data; //获取到被删除元素的值 p->next = cur->next; //p再指向next的next,此时就相当于跳过了p->next这个结点,实现删除 free(cur); //释放cur return true; }
- 单链表的基本操作-----指定结点的删除
//指定结点的删除 bool DeleteNode(LinkList* p) { if (p == NULL) return false; LinkList* cur = p->next; //此处删除p结点,和前插类似,将p->next的值放到p上,再删除p->next,相当于删除了p。 p->data = cur->data; p->next = cur->next; // 此代码有个bug,就是如果p结点是最后一个结点,会报空指针异常 free(cur); return true; }
- 单链表的基本操作-----按位查找(带头结点)
//按位查找,返回第i个元素(带头结点) LinkList* GetElem(LinkList* L, int i) { if (i < 0) return NULL; LinkList* p; int j = 0; p = L; //L指向头结点,头结点是第0个结点(不存数据) while (p != NULL && j < i) { p = p->next; j++; } return p; }
- 单链表的基本操作-----按值查找(带头结点)
//按值查找,找到数据域==e的结点(带头结点) LinkList* LocateElem(LinkList* L, int e) { LinkList* p = L->next; //从第一个结点开始查找 while (p != NULL && p->data != e) { p = p->next; } return p; //找到后返回该结点的指针,否则返回NULL }
- 单链表的基本操作-----尾插法建立单链表
//尾插法建立单链表 LinkList* ListTailInsert(LinkList* L) { int x; //插入的类型为整型 L = (LinkList*)malloc(sizeof(LinkList)); //建立头结点 L->next = NULL; LinkList* s, * r = L; //r为表尾指针 scanf("%d", &x); while (x != 9999) { s = (LinkList*)malloc(sizeof(LinkList)); s->data = x; r->next = s; r = s; //r指向新的表尾结点 scanf("%d", &x); } r->next = NULL; return L; }
- 单链表的基本操作-----头插法建立单链表(单链表的逆置)
//头插法建立单链表 LinkList* HeadInsert(LinkList* L) { LinkList* s; int x; L = (LinkList*)malloc(sizeof(LinkList)); //建立头结点 L->next = NULL; //初始化为空链表,得置空,有可能指向一个未知区域 scanf("%d", &x); while (x != 9999) { s = (LinkList*)malloc(sizeof(LinkList)); s->data = x; s->next = L->next; L->next = s; scanf("%d", &x); } return L; }
单链表的创建及其基本操作
最新推荐文章于 2024-11-09 20:38:27 发布