单向链表

来源:互联网 发布:淘宝直通车出价公式 编辑:程序博客网 时间:2024/06/03 19:44

这是一个C语言写的单向链表,数据比较简单

// sngly-linked list.cpp : 定义控制台应用程序的入口点。//第一个链表存放链表信息////空表:除了头结点,其他表为空#include "stdafx.h"#include<stdlib.h>#define initSize 10#define increment 2typedef int ElemType;typedef int status; typedef struct SL{ElemType data;int position; SL *next;}; SL *s, *m;//用于创建链表 SL *head,*tail;//头指针,尾指针 int size = 0; SL* initList(SL *a, SL *b, int length); void traverse(SL *s); void insert(SL*a); voidPdeletion(SL *a); void reorder(SL *a); void Ddeletion(SL *a); void PFrontChect(SL *a); void PNextChect(SL *a); void overview(); void destory(SL *a); void clearData(SL *a); void DFrontChect(SL *a); void DNextChect(SL *a); void IsEmpty(SL *a);int main(){int length;//链表长度printf("请输入您需要的链表长度:");scanf("%d", &length);traverse(initList(s, m, length));traverse(head);insert(tail);traverse(head);insert(tail);traverse(head);Pdeletion(head);Pdeletion(head);reorder(head);traverse(head);Ddeletion(head);Ddeletion(head);Ddeletion(head);traverse(head);PFrontChect(head);traverse(head);PNextChect(head);traverse(head);overview();traverse(head);clearData(head);traverse(head);destory(head);traverse(head);DFrontChect(head);DFrontChect(head);DNextChect(head);DNextChect(head);IsEmpty(head);clearData(head);IsEmpty(head);destory(head);IsEmpty(head);Ddeletion(head);traverse(head);return 0;}SL* initList(SL *a,SL *b,int length){size = initSize + sizeof(SL);a = b = ( SL *) malloc(initSize + sizeof(SL));head = a;for (int i = 0; i < length; i++){if (i == 0){a->data = length;b = (SL *)malloc(initSize + sizeof(SL));a->next = NULL;a->position = i;continue;}else{a->next = b;a = b;}printf("请为NO.%d赋值:", i);scanf("%d", &a->data);printf("已经为NO.%d赋值:%d\n", i, a->data);b = (SL *)malloc(initSize + sizeof(SL));a->next = NULL;a->position = i;}tail = a;printf("链表长度为%d,空间大小为%d\n", length, size);free(b);return head;}void traverse(SL *a){if (a == NULL){printf("链表不存在\n");return;}printf("本链表共%d个,这是第0个\n", a->data);a = a->next;while (a != NULL){printf("第%d个:%d\t",a->position, a->data);a = a->next;}printf("\n");}//在最后一个插入,传入尾指针void insert(SL*a){if (a == NULL){printf("链表不存在\n");return;}head->data++;s = (SL*)malloc(initSize + sizeof(SL));s->position=a->position++;a->next = s;s->next = NULL;printf("请输入插入的数据:");scanf("%d", &s->data);tail = s;//尾指针变动}//删除某一个,依据position,传入头指针voidPdeletion(SL *a){int times = 0;if (a == NULL){printf("链表不存在\n");return;}int p;printf("请输入要删除的链表序号\n");scanf("%d", &p);if (p == 0){printf("链表第0个元素不可删除,除非使用destory\n");return;}while (a != NULL){if (a->position == p){//如果是最后一个元素,变动尾指针if (p == tail->position){tail = s;}s->next = a->next;a->next = NULL;free(a);head->data--;return;}else{s = a;a = a->next;}}printf("未查询到该数据\n");return;}//删除某一个,依据data,传入头指针, 可以批量删除void Ddeletion(SL *a){int times=0;if (a == NULL){printf("链表不存在\n");return;}ElemType d;printf("请输入要删除的链表数据\n");scanf("%d", &d);s = a;while (a != NULL){if (a->data == d){//如果是最后一个元素,变动尾指针if (d == tail->data||a->next==NULL){tail = s;}//如果第0个,跳过if (a->position == 0){printf("链表第0个不可删除,除非使用destory\n");s = a;a = a->next;continue;}s->next = a->next;a->next = NULL;free(a);a = s->next;head->data--;times++;}else{s = a;a = a->next;}}if (times==0){printf("未查询到该数据\n");return;}else{printf("已经删除%d个\n", times);return;}}//重新排序,依照链表位置依次赋值position 1~n,传入头指针void reorder(SL *a){if (a == NULL){printf("链表不存在\n");return;}a = a->next;for (int i=1;a != NULL;i++){a->position = i;a = a->next;}}//前驱查询,传入头指针,依据位置positionvoid PFrontChect(SL *a){if (a == NULL){printf("链表不存在\n");return;}int p;printf("请输入要进行前驱查询的的链表序号\n");scanf("%d", &p);if (p == 0){printf("这是第一个链表元素,不存在前驱\n");return;}else{while (a != NULL){if (a->position == p){printf("第%d个:%d的前驱是:\t", a->position, a->data);printf("第%d个:%d\n", s->position, s->data);return;}else{s = a;a = a->next;}}printf("不存在该链表\n");return;}}//后继查询,传入头指针,依据位置positionvoid PNextChect(SL *a){if (a == NULL){printf("链表不存在\n");return;}int p;printf("请输入要进行后继查询的的链表序号\n");scanf("%d", &p);if (p == tail->data-1){printf("这是最后一个链表元素,不存在后继\n");return;}else{while (a != NULL){if (a->position == p){printf("第%d个:%d的后继是:\t", a->position, a->data);a = a->next;if (a == NULL){printf("这是最后一个链表元素,不存在后继\n");}else{printf("第%d个:%d\n", a->position, a->data);}return;}else{a = a->next;}}printf("不存在该链表\n");return;}}void DFrontChect(SL *a){{if (a == NULL){printf("链表不存在\n");return;}int d;printf("请输入要进行前驱查询的的链表数据\n");scanf("%d", &d);if (d == a->data){printf("这是第一个链表,不存在前驱\n");return;}else{while (a != NULL){if (a->data == d){printf("第%d个:%d的前驱是:\t", a->position, a->data);printf("第%d个:%d\n", s->position, s->data);return;}else{s = a;a = a->next;}}printf("不存在该链表\n");return;}}}void DNextChect(SL *a){if (a == NULL){printf("链表不存在\n");return;}int d;printf("请输入要进行后继查询的的链表数据\n");scanf("%d", &d);if (d == tail->data){printf("这是最后一个链表,不存在后继\n");return;}else{while (a != NULL){if (a->data == d){printf("第%d个:%d的后继是:\t", a->position, a->data);a = a->next;printf("第%d个:%d\n", a->position, a->data);return;}else{a = a->next;}}printf("不存在该链表\n");return;}}//查看表信息void overview(){if (head == NULL){printf("链表不存在\n");return;}printf("本链表共%d个元素,空间大小为%d\n", head->data,sizeof(SL)+initSize);return;}//销毁,传入头指针void destory(SL *a){if (a == NULL){printf("链表不存在\n");return;}s = a;while (a != NULL){a = a->next;free(s);s = a;}head = NULL;return ;}//清空,,传入头指针void clearData(SL *a){if (a == NULL){printf("链表不存在\n");return;}a = a->next;for (int i = 1; a != NULL; i++){a->data = '\0';a = a->next;}}void IsEmpty(SL *a){if (a == NULL){printf("表不存在\n");return;}if (a->data == 1){printf("空表\n");//除了头结点,其他表为空return;}else{printf("表非空\n");return;}}


0 0
原创粉丝点击