单链表原地逆转 c语言,链式结构线性表的实现(二)

链式结构线性表的实现(二)

一、目的:

掌握链表的表示方法,存储结构及其基本操作的实现,灵活使用链表。

二、要求:

修改实验三的程序,完成

(1)实现带头接点的单链表的原地逆转(结果链表仍使用原链表的存储空间,不另开辟存储空间)。

(2)用带头接点的单向链表实现集合操作 AUB 。(结果链表仍使用原来两个链表的存储空间,不另开辟存储空间)。

三、实验内容

1、设计程序。

2、调试程序,并设计输入数据。

四、实验报告要求

写出程序和实验结果,并画出链表变化的示意图。

合并:

#include "stdio.h"

#include "stdlib.h"

typedef struct node

{ int data;

struct node *next;

}slink;

slink *creslink(int n)

{

slink *head,*p,*s;

int i;

if(n<1) return NULL;

p=head=(slink *)malloc(sizeof(slink));

printf("请输入每个结点的元素的值");

for(i=1;i<=n;i++)

{ s=(slink *)malloc(sizeof(slink));

scanf("%d",&(s->data));

p->next=s;

p=s;

}

p->next=NULL;

return head;

}

void printlist(slink *head)

{slink *p;

p=head->next;

while(p!=NULL)

{printf("%4d",p->data);

p=p->next;

}

printf("\n");

}

void bring(slink *head1,slink *head2)

{

slink *l,*p,*q;

int i;

l=head2->next;

while(l!=NULL)

{ p=head1;q=head1->next;

while(q!=NULL&&q->data!=l->data)

{p=q;q=q->next;}

if(q!=NULL)

{p->next=q->next;

free(q);

}

l=l->next;

}

for(l=head1;l->next!=NULL;l=l->next);

l->next=head2->next;

free(head2);

}

void main()

{ slink *head1,*head2;

int n,x,i,j;

printf("请输入第一个链表元素的个数");

scanf("%d",&n);

head1=creslink(n);

printf("\n");

printlist(head1);

printf("请输入第二个链表元素的个数");

scanf("%d",&n);

head2=creslink(n);

printf("\n");

printlist(head2);

printf("\n");

printf("合并后的链表变成:");

bring(head1,head2);

printlist(head1);/*输出单链表中结点的元素值*/

}

//以下程序为多项式求和的程序

#include"stdio.h"

#include"stdlib.h"

typedef struct node

{ int xc;

int e;

struct node *next;

}dxs;

dxs *creat(int m)

{dxs *head,*p,*q;int i;

p=head=(dxs *)malloc(sizeof(dxs));

for(i=1;i<=m;i++)

{q=(dxs *)malloc(sizeof(dxs));

scanf("%d%d",&q->xc,&q->e);

p->next=q;

p=q;

}

p->next=NULL;

return head;

}

plus(dxs *h1,dxs *h2)

{dxs *h,*p1,*p2,*q;

h=h1;

p1=h1->next;

p2=h2->next;

while(p1!=NULL&&p2!=NULL)

if(p1->ee)

{h->next=p1;h=p1;p1=p1->next;}

else if(p2->ee)

{h->next=p2;h=p2;p2=p2->next;}

else if(p1->xc+p2->xc!=0)

{p1->xc=p1->xc+p2->xc;

h->next=p1;h=p1;p1=p1->next;

q=p2;

p2=p2->next;

free(q);

}

else

{q=p1;p1=p1->next;free(q);

q=p2;p2=p2->next;free(q);

}

if(p1!=NULL)

h->next=p1;

else h->next=p2;

free(h2);

}

void list(dxs *head)

{dxs *p=head->next;

while(p!=NULL)

{printf("(%4d,%4d) ",p->xc,p->e);

p=p->next;

}

printf("/n");

}

main()

{dxs *h1,*h2;

h1=creat(3);

h2=creat(4);

plus(h1,h2);

list(h1);

}

原地逆转:

#include "stdio.h"

#include "stdlib.h"

typedef struct node

{ int data;

struct node *next;

}slink;

slink *creslink(int n)

{

slink *head,*p,*s;

int i;

if(n<1) return NULL;

p=head=(slink *)malloc(sizeof(slink));

printf("请输入每个结点的元素的值");

for(i=1;i<=n;i++)

{ s=(slink *)malloc(sizeof(slink));

scanf("%d",&(s->data));

p->next=s;

p=s;

}

p->next=NULL;

return head;

}

int Delete(slink *head,int i, int *e)

{slink *p,*q;

int j;

if (i<1)return 0;

p=head;j=0;

while(p->next!=NULL && j{p=p->next;j++;}

if(p->next==NULL)return 0;

q=p->next;

p->next=q->next;

*e=q->data;

free(q);

return 1;

}

int insert(slink *head,int i, int x)

{slink *p,*q;

int j;

if (i<1)return 0;

p=head;j=0;

while(p!=NULL && j{p=p->next;j++;}

if(p==NULL)return 0;

q=(slink *)malloc(sizeof(slink));

q->data=x;

q->next=p->next;

p->next=q;

return 1;

}

void printlist(slink *head)

{slink *p;

p=head->next;

while(p!=NULL)

{printf("%4d",p->data);

p=p->next;

}

printf("\n");

}

void turn(slink *head)

{slink *p,*q;

p=head->next;head->next=NULL;

while(p!=NULL)

{

q=p->next;

p->next=head->next;

head->next=p;

p=q;

}

}//单链表的原地逆转;

void main()

{ slink *head;

int n,x,i,j;

printf("请输入元素个数");

scanf("%d",&n);

head=creslink(n);

printf("\n");

printlist(head);

printf("\n");

printf("请输入插入的数据元素的值");

scanf("%d",&x);

printf("请输入要在哪个位序之前插入");

scanf("%d",&i);

insert(head, i,x);/*在单链表第i个元素前插入x*/

printf("\n");

printlist(head);/*输出单链表中结点的元素值*/

printf("请输入删除的数据元素的位序");

scanf("%d",&i);

j=Delete(head,i, &x);

printf("\n");

if(j)printf("%d",x);/*删除成功,则输出被删除结点的元素值*/

printf("\n");

printf("最终的链表变成:");

printlist(head);/*输出单链表中结点的元素值*/

turn(head);

printf("原地逆转后的链表变成:");

printlist(head);/*输出单链表中结点的元素值*/

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值