数据结构一一线性表的链式存储结构之删除操作

来源:互联网 发布:vscode 选中一行 编辑:程序博客网 时间:2024/06/05 18:58

单链表删除第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. 返回成功。
#include <iostream>#include <stdio.h>#include <time.h>#include <malloc.h>#define ERROR0#define OK1typedef 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)=01.遍历操作2.插入操作3.删除操作0.退出请选择你的操作:2在L的表头依次插入10个随机数后:-> 52 -> 25 -> 87 -> 49 -> 67 -> 77 -> 91 -> 50 -> 18 -> 511-> 52 -> 25 -> 87 -> 49 -> 67 -> 77 -> 91 -> 50 -> 18 -> 513要删除第几个元素?3删除第3个元素成功,现在链表为:-> 52 -> 25 -> 49 -> 67 -> 77 -> 91 -> 50 -> 18 -> 51

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩不爱刷牙怎么办 小孩子不刷牙怎么办 小孩子不爱刷牙怎么办 幼儿不爱刷牙怎么办 小孩不刷牙怎么办 儿童不喜欢刷牙怎么办 小孩不刷牙 怎么办 小孩不愿意刷牙怎么办 宝宝不喜欢刷牙怎么办 小孩不肯刷牙怎么办 宝宝不刷牙怎么办 微信要实名验证怎么办 做事一直都不顺怎么办 总心不在焉怎么办? 做事心急怎么办 总是心不在焉怎么办 做事走神怎么办 老人幻想症怎么办 妄想严重了怎么办 有妄想症怎么办 钟情妄想症怎么办 被害妄想怎么办 偏执妄想症怎么办 油画棒弄到衣服怎么办 蜡笔画在墙上怎么办 废旧油画棒怎么办 儿童铅偏高怎么办 小孩误食蜡笔怎么办 水粉颜色会怎么办 钢笔堵墨怎么办 指甲油涂手上怎么办 油画不干怎么办 蜡笔画墙上怎么办 飞机票好贵怎么办 轮状病毒发烧怎么办 第一次坐飞机怕怎么办 高铁坐过了怎么办 坐飞机恐惧怎么办 坐飞机心慌害怕怎么办 老人不会坐高铁怎么办 大人不识字怎么办