线性表---就地逆置
来源:互联网 发布:ios wkwebview js弹窗 编辑:程序博客网 时间:2024/05/01 05:48
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<LinkList.h>void main(){int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int i;LinkList L;InitList(&L);for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++){if (InsertList(L, i, a[i - 1]) == 0){printf("位置不合法!");return;}}DisplayList(L);ReverseList(L);DisplayList(L);}
/*LinkList.h*/#include "stdio.h"#include "math.h"#include "malloc.h"#include "stdlib.h"typedef int DataType;//ListNode是链表的结点类型,LinkList是指向链表的指针类型//如果定义了 LinkList L;则定义了一个链表,L指向该链表的第一个结点//不带头结点,链表为空,L=NULL;带头结点,链表为空,L->next = NULL;typedef struct Node{ DataType data; struct Node *next;}ListNode, *LinkList;//初始化单链表,将单链表置空//将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置空//根据typedef定义,LinkList 就是 ListNode* ,即 ListNode 的指针;//根据InitList函数的形参声明,head 变量是 LinkList 类型的指针,即 ListNode 的二级指针。//因此,*head 才是LinkList类型。void InitList(LinkList *head) { if ((*head = (LinkList)malloc(sizeof(ListNode))) == NULL) /*为头结点分配一个存储空间*/ exit(-1); /* exit是一个进程,-1表示异常退出,要包含头文件 "stdlib.h" */ (*head)->next = NULL;}//判断单链表是否为空,就是通过判断头结点的 指针域是否为空//空返回 1 ; 否则返回 0;int ListEmpty(LinkList head) { if (head->next == NULL) return 1; else return 0;}//按序号查找操作//查找单链表中第i个结点。查找成功返回该结点的指针,否则返回NULL标志失败ListNode* Get(LinkList head, int i) { ListNode *p; int j; if (ListEmpty(head)) //不为 0 表示链表为空 return NULL; if (i < 1) //判断序号是否合法 return NULL; j = 0; p = head; while (p->next != NULL && j < i) { p = p->next; j++; } if (j == i) return p; //找到第 i 个结点,返回指针p; else return NULL; //如果没找到第 i 个元素,返回NULL;}//按内容查找操作//查找线性表中元素值为 e 的元素//成功返回对应元素的结点的指针;否则返回NULL,表示失败ListNode* LocateElem(LinkList head, DataType e) { ListNode* p; p = head->next; //指针p指向第一个结点 while (p) { if (p->data != e) p = p->next; else break; } return p;}//定位操作//按内容查找并返回该结点的序号,称为定位函数//查找线性表中元素值为 e 的元素,成功返回对应元素的序号,否则返回0;int LocatePos(LinkList head, DataType e) { ListNode* p; int i; if (ListEmpty(head)) //先判断链表是否为空 return 0; p = head->next; //指针p指向第一个结点 i = 1; while (p) { if (p->data == e) return i; else { p = p->next; i++; } } if (!p) //while 循环完也没有找到e,说明不存在e,返回0; return 0;}//插入操作//在单链表中第i个位置插入一个结点,结点的元素值为e,插入成功返回1,失败返回0int InsertList(LinkList head, int i, DataType e) { ListNode *p, *pre; //指针pre 是指向第i个元素的前驱结点,指针p指向新生成的结点 int j; pre = head; j = 0; while (pre->next != NULL&&j < i - 1) //为了找到第i-1个结点 { pre = pre->next; j++; } if (j != i - 1) //现在j应该等于 i-1,不等于说明没找到,插入位置错误 { printf("插入位置错误"); return 0; } if ((p = (ListNode*)malloc(sizeof(ListNode))) == NULL) exit(-1); //进程异常退出申请新结点失败 p->data = e; //插入结点操作,顺序不能调换 p->next = pre->next; pre->next = p; return 1;}//删除操作//删除单链表中的第i个位置的结点。删除成功返回1,失败返回0int DeleteList(LinkList head, int i, DataType *e) { ListNode *p, *pre; int j; pre = head; j = 0; while (pre->next != NULL && pre->next->next != NULL && j < i - 1) /*判断是否找到前驱结点*/ { pre = pre->next; j++; } if (j != i - 1) //没有找到要删除的结点位置,说明删除位置错误 { printf("删除位置错误"); return 0; } //走到这里j=i-1 //指针p指向单链表的第i个结点,并将该结点的数据域赋值给 e p = pre->next; *e = p->data; //将前驱结点的指针域指向要删除结点的下一个结点 pre->next = p->next; //释放 p 指向的结点 free(p); return 1;}//求表长操作//就是返回单链表元素个数int ListLength(LinkList head) { ListNode *p; int count = 0; p = head; while (p->next != NULL) { p = p->next; count++; } return count;}//销毁链表操作 释放结点空间void DestoryList(LinkList head) { ListNode *p, *q; p = head; while (p != NULL) { q = p; p = p->next; free(q); }}void ReverseList(LinkList head){LinkList q, p;p = head->next;head->next = NULL;while (p){q = p->next;p->next = head->next;head->next = p;p = q;}}void DisplayList(LinkList head){int i;LinkList p;for (i = 1; i <= ListLength(head); i++){p = Get(head,i);if (p)printf("%4d",p->data);}printf("\n");}
0 0
- 线性表---就地逆置
- 线性表的就地逆置
- 链式线性表的就地逆置
- 线性表之顺序表奇偶调整和单链表就地逆置
- 线性表的就地逆置(数组实现+链表实现)
- 实验项目4——基本线性表就地逆置(顺序结构)
- 数据结构题典003:线性表的就地逆置/翻转(ANSI C)
- 链表就地逆置
- 链表就地逆置
- 链表就地逆置
- 链表就地逆置
- 试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法
- 链表的就地逆置
- 单向循环链表就地逆置
- 24. 链表就地逆置
- 顺序表的就地逆置
- 链表就地逆置和合并
- 【应用】顺序表的就地逆置
- VM 克隆的 centos 的Linux下网卡eth1如何修改为eth0解决办法
- 循环链表--约瑟夫问题
- 双向链表的应用
- 静态链表的应用
- 各种线性表的操作
- 线性表---就地逆置
- android studio 配置 SVN 详解
- 7
- 线性结构---连续存储[数组]
- 6- js 函数的四种调用方式
- ubuntu上使用PHP依赖管理工具Composer(二)——自动加载
- windows下与linux下安装redis及redis扩展
- ASP.NET MVC 5 - 入门
- [NOIP2012][vijos1792]摆花(dp)