说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。
#include <stdio.h> #include <malloc.h> const int OK = 1; //定义正确返回 const int ERROR = -1; //定义错误的返回 const int OVERFLOW = -2; //定义溢出 //定义元素类型 typedef int ElemType; //定义返回类型 typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList; //获取第i个元素(L为带头结点的单链表的头指针) Status GetElem_L(LinkList L, int i, ElemType &e){ LinkList p = L->next; //L->next指向头结点 int j = 1; while(p&&j<i){ p = p->next; ++j; } if(!p || j>i) return ERROR; e = p->data; return OK; } //插入元素(第i个位置之前插入元素) Status ListInsert_L(LinkList L, int i, ElemType &e){ LinkList p = L; //头结点 int j = 0; while(p && j<i-1){ p = p->next; ++j; } if(!p || j>i-1) return ERROR; LinkList s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; } //删除第i个元素 Status ListDelete_L(LinkList &L, int i, ElemType &e){ LinkList p = L; //p指针指向头结点 int j = 0; while(p && j<i-1){ p = p->next; ++j; } if(!p || j>i-1) return ERROR; LinkList s = p->next; p->next = s->next; e = s->data; free(s); return OK; } //创建链表,并添加n个数据结点 void CreateList_L(LinkList &L, int n){ L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; //创建一个带头结点的单链表 int i; LinkList p; for(i=n;i>0;--i){ p = (LinkList)malloc(sizeof(LNode)); printf("请输入链表第%d个元素的数据:\n", i); scanf("%d", &p->data); p->next = L->next; //头插法 L->next = p; } } //遍历链表 void ShowList_L(const LinkList &L){ LinkList p = L->next; int j = 1; while(p){ printf("链表的第%d个元素是%d\n", j, p->data); p = p->next; ++j; } } int main(){ LinkList L; printf("============创建5个数据结点============\n"); CreateList_L(L, 5); ShowList_L(L); printf("============删除了第5个元素============\n"); ElemType e; ListDelete_L(L, 5, e); ShowList_L(L); printf("============添加第5个元素=============\n"); ListInsert_L(L, 5, e); ShowList_L(L); scanf("%d"); return 0; }
部分说明:
1、第i个元素之前插入元素
如上图所示,假如现在有4个元素,那么有四个可选插入位置(①②③④):
让p先指向头结点,我们需要找到第i-1个结点,也就是需要插入位置的前一个结点,比如我们要插入到i=3,那么需要找到2位置,插入到③位置。
时间: 2024-11-08 03:25:25