永发信息网

单链表问题用C语言编写

答案:4  悬赏:50  手机版
解决时间 2021-04-03 10:40
  • 提问者网友:沉默菋噵
  • 2021-04-03 04:53
已知两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-04-03 05:13
用一组地址任意的存储单元存放线性表中的数据元素。
  以元素(数据元素的映象)
  + 指针(指示后继元素存储位置)
  = 结点
  (表示数据元素 或 数据元素的映象)
  以“结点的序列”表示线性表
全部回答
  • 1楼网友:未来江山和你
  • 2021-04-03 07:44
#include"stdio.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType elem; struct LNode *next; }LNode,*LinkList; Status ListInit(LinkList *L) { *L=(LinkList)malloc(sizeof(LNode)); if(!*L)exit(OVERFLOW); (*L)->next=NULL; return OK; } void vist(ElemType e) { printf("->%d",e); } Status ListInsert(LinkList L,int i,ElemType e) { int j=0; LinkList p=L,s; while(p&&j<i-1) { ++j; p=p->next; } if(!p||j>i-1)return ERROR; s=(LinkList)malloc(sizeof(LNode)); s->elem=e; s->next=p->next; p->next=s; return OK; } void ListTraverse(LinkList L,void(*vi)(ElemType)) { LinkList p=L->next; while(p) { vi(p->elem); p=p->next; } } Status Delete(LinkList L,int i,int len) { LinkList p,q; int j=0; p=L; while(p&&j<i-1) { ++j; p=p->next; } if(!p||j>i-1) { printf("起始位置不合适\n"); return ERROR; } j=0; q=L; while(q&&j<i+len-1) { ++j; q=q->next; } if(!q||j>i+len-1) { printf("末尾位置不合适\n"); return ERROR; } p->next=q->next; return OK; } Status Insert(LinkList LA,LinkList LB,int pos) { int j=0; LinkList p=LB,q; while(j<pos-1&&p) { ++j; p=p->next; } if(j>pos-1||!p) { printf("位置错误\n"); return ERROR; } q=LA; while(q->next)q=q->next; q->next=p->next; p->next=LA->next; return OK; } void main() { int i; int s,t; LinkList L,T; ListInit(&L); ListInit(&T); for(i=1;i<=10;++i) ListInsert(L,i,i); for(i=1;i<=10;++i) ListInsert(T,i,i); printf("A表的元素:\n"); ListTraverse(L,vist); printf("\n"); printf("B表的元素:\n"); ListTraverse(T,vist); printf("\n"); Delete(L,3,1); printf("A表删除后的元素:\n"); ListTraverse(L,vist); printf("\n"); Insert(L,T,3); printf("\n"); printf("A表删除后插入到B表:\n"); ListTraverse(T,vist); }
  • 2楼网友:西风乍起
  • 2021-04-03 06:06
因为不知道具体问题,只能写出算法思想提供参考,假设单链表节点类型为nodenode *p,*q,*a;p=heada.next;(A的第一个元素)int k;for(k=0;k<i-1;k++)p=p.next (找出第i-1个元素)for(k=0;k<len;k++)p.next=p.next.next (删除自第i个元素起len个元素)p=headb.next (B的第一个元素)for(k=0;k<j-1;k++)p=p.next (找出B的第j-1个元素)q=p.next (q指向第j个元素)a=heada.next while(a.next!=null)a=a.next (找出A的最后一个元素)p.next=heada.next;a.next=q; (链接完成)
  • 3楼网友:玩世
  • 2021-04-03 05:48
LinkedList DelInsert ( LinkedList &heada, LinkedList &headb, int i, int j, int len ) //heada和headb均是带头结点的单链表。本算法删除heada链表中自第i个元素起的共len个元素, 然后将单链表heada插入到headb的第j个元素之前。 { if ( i < 1 || len < 1 || j < 1) { printf ( "参数错误\n"); exit ( 0); } p = heada; //p为链表A的工作指针, 初始化为A的头指针, 查到第i个元素时, p指向第i-1个元素 int k = 0; //计数 while ( p != null && k < i-1) //查找第i个结点。 { k++; p = p->next; } if ( p == null) //i太大, 退出算法 { printf ( "给的%d太大了\n", i); exit ( 0); } q = p->next; //q为工作指针, 初始指向A链表第一个被删结点。 k = 0; while ( q != null && k < len) { k++; u = q; q = q->next; free ( u); //删除结点, 后移指针。 } if ( k < len) { printf ( "给的%d太大了\n", len); exit ( 0); } p->next=q; //A链表删除了len个元素。 if ( heada->next!=null) //heada->next=null说明链表中结点均已删除, 无需往B表插入 { while ( p->next != null) //找A的尾结点。 p = p->next; q = headb; //q为链表B的工作指针。 k = 0; //计数 while ( q != null && k < j - 1) //查找第j个结点,查找成功时,q指向第j-1个结点 { k++; q = q->next; } if ( q == null) { printf ( "给的%d太大了\n", j); exit ( 0); } p->next = q->next; //将A链表链入 q->next = heada->next; //A的第一元素结点链在B的第j-1个结点之后 } free ( heada); //释放A表头结点。 return headb; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯