数据结构一一线性表的链式存储结构之删除操作
2017-12-25 18:23
351 查看
单链表删除第i个数据结点的算法思路:
声明一结点p指向链表第一个结点,初始化j从1开始;
当j < i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加 1;
若到链表末尾p为空,则说明第i个元素不存在;
否则査找成功,将欲删除的结点p->next賦值给q;
单链表的删除标准语句p->next=q->next;
将q结点中的数据赋值给e,作为返回;
释放q结点;
返回成功。
声明一结点p指向链表第一个结点,初始化j从1开始;
当j < i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加 1;
若到链表末尾p为空,则说明第i个元素不存在;
否则査找成功,将欲删除的结点p->next賦值给q;
单链表的删除标准语句p->next=q->next;
将q结点中的数据赋值给e,作为返回;
释放q结点;
返回成功。
#include <iostream> #include <stdio.h> #include <time.h> #include <malloc.h> #define ERROR 0 #define OK 1 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct Node { ElemType data; struct Node *next; }Node; /* 定义LinkList */ typedef struct Node *LinkList; /* 初始化顺序线性表 */ Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L)) /* 存储分配失败 */ { return ERROR; } (*L)->next=NULL; /* 指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(LinkList L) { int i=0; LinkList p=L->next; /* p指向第一个结点 */ while(p) { i++; p=p->next; } return i; } Status visit(ElemType c) { printf("-> %d ",c); return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素输出 */ Status ListTraverse(LinkList L) { LinkList p=L->next; while(p) { visit(p->data); p=p->next; } printf("\n"); return OK; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ Status ListInsert(LinkList *L,int i,ElemType e) { int j; LinkList p,s; p = *L; /* 声明一个结点 p,指向头结点 */ j = 1; while (p && j < i) /* 寻找第i个结点 */ { p = p->next; ++j; } if (!p || j > i) return ERROR; /* 第i个元素不存在 */ s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */ s->data = e; s->next = p->next; /* 将p的后继结点赋值给s的后继 */ p->next = s; /* 将s赋值给p的后继 */ return OK; } /* 单链表删除第i个数据结点的算法思路: 1.声明一结点p指向链表第一个结点,初始化j从1开始; 2.当j < i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加 1; 3.若到链表末尾p为空,则说明第i个元素不存在; 4.否则査找成功,将欲删除的结点p->next賦值给q; 5.单链表的删除标准语句p->next=q->next; 6.将q结点中的数据赋值给e,作为返回; 7.释放q结点; 8.返回成功。 */ Status ListDelete(LinkList *L,int i,ElemType *e) { int j; LinkList p,q; p = *L; // 声明一结点p指向链表第一个结点 j = 1; while (p->next && j < i) /* 遍历寻找第i个元素 */ { p = p->next; ++j; } if (!(p->next) || j > i) return ERROR; /* 第i个元素不存在 */ q = p->next; p->next = q->next; /* 将q的后继赋值给p的后继 */ *e = q->data; /* 将q结点中的数据给e */ free(q); /* 让系统回收此结点,释放内存 */ return OK; } int main() { LinkList L; Status i; int j,k,pos; char opp = 'x'; ElemType e; i=InitList(&L); printf("链表L初始化完毕,ListLength(L)=%d\n",ListLength(L)); printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n0.退出 \n请选择你的操作:\n"); while(opp != '0'){ scanf("%c",&opp); switch(opp){ case '1': ListTraverse(L); printf("\n"); break; case '2': srand((unsigned)time(NULL)); for(j=1;j<=10;j++) { i=ListInsert(&L,1,rand()%100); } printf("在L的表头依次插入10个随机数后:"); ListTraverse(L); printf("\n"); break; case '3': printf("要删除第几个元素?"); scanf("%d",&pos); ListDelete(&L,pos,&e); printf("删除第%d个元素成功,现在链表为:\n", pos); ListTraverse(L); printf("\n"); break; case '0': exit(0); } } }
链表L初始化完毕,ListLength(L)=0 1.遍历操作 2.插入操作 3.删除操作 0.退出 请选择你的操作: 2 在L的表头依次插入10个随机数后:-> 52 -> 25 -> 87 -> 49 -> 67 -> 77 -> 91 -> 50 - > 18 -> 51 1 -> 52 -> 25 -> 87 -> 49 -> 67 -> 77 -> 91 -> 50 -> 18 -> 51 3 要删除第几个元素?3 删除第3个元素成功,现在链表为: -> 52 -> 25 -> 49 -> 67 -> 77 -> 91 -> 50 -> 18 -> 51
相关文章推荐
- 数据结构一一线性表的链式存储结构之查找操作
- 数据结构一一线性表的链式存储结构之整表删除
- 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
- 数据结构一一线性表的链式存储结构之头插法和尾插法建立链表
- 数据结构一一线性表的链式存储结构之插入与遍历
- 数据结构:线性表的链式存储结构_单链表
- 线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表
- 关于线性表的链式存储(链表)的创建,头插法,尾插法,删除链表结点的操作
- 线性表的链式存储的插入与删除操作
- 线性表的基本操作:插入、删除、查找等操作在顺序存储结构和链接存储结构上的算法
- C语言数据结构-2.线性表之链式存储结构
- 数据结构:线性表之链式存储结构
- 数据结构一一线性表的顺序存储结构之删除操作
- 【数据结构】单向线性链式物理结构list
- 数据结构之线性结构的一些操作总结
- 数据结构复习——线性表的链式存储实现(单向链表)
- <<C#版数据结构>>之--线性表的链式存储(单链表)
- 线性表的链式存储基本操作
- 数据结构之线性结构的离散存储(单链表)
- 队列的链式存储结构与操作