链表
来源:互联网 发布:安装ubuntu出错404 编辑:程序博客网 时间:2024/05/18 11:46
#include<string.h>#include<malloc.h> /* malloc()等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<math.h> /* floor(),ceil(),abs() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef int ElemType; // 定义元素的类型为整型//定义链表struct LNode{ ElemType data; struct LNode *next;};typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 *///返回第i个元素Status GetElem(LinkList L,int i,ElemType *e) { /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */ int j=1; /* j为计数器 */ LinkList p=L->next; /* p指向第一个结点 */ while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */ { p=p->next; j++; } if(!p||j>i) /* 第i个元素不存在 */ return ERROR; *e=p->data; /* 取第i个元素 */ return OK;}//在第i个位置插入eStatus ListInsert(LinkList L,int i,ElemType e){ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */ int j=0; LinkList p=L,s; while(p&&j<i-1) /* 寻找第i-1个结点 */ { p=p->next; j++; } if(!p||j>i-1) /* i小于1或者大于表长 */ return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */ s->data=e; /* 插入L中 */ s->next=p->next; p->next=s; return OK;}//第i个元素,并由e返回其值Status ListDelete(LinkList L,int i,ElemType *e) { /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */ int j=0; LinkList p=L,q; while(p->next&&j<i-1) /*寻找第i个结点,并令p指向其前趋 */ { p=p->next; j++; } if(!p->next||j>i-1) /* 删除位置不合理 */ return ERROR; q=p->next; /* 删除并释放结点 */ p->next=q->next; *e=q->data; free(q); return OK;}// 显示链表中的元素,返回值为链表元素的数目int ShowList(LinkList L){ int numOfList = 0; // 记录链表中元素的数目 LinkList p = L->next; // 用来遍历链表元素的指针 while(p) // 如果该结点不为空 { if(numOfList) // 如果该元素不是列表中的第一个元素(先判断值是否为0,然后加1) { putchar(' '); } numOfList++; // 元素的数目加1 printf("%d",p->data); // 输出元素 p = p->next; // 指针向后移动 } if(numOfList == 0) // 如果链表中的元素数目为0,说明是空链表 { return 0; } else { putchar('\n'); // 注意换行 return numOfList; // 返回链表中元素的数目 }}
0 0