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

来源:互联网 发布:商业源码网 编辑:程序博客网 时间:2024/06/05 01:39

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

一、目的:

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

 

二、要求:

修改实验三的程序,完成

(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->e<p2->e)
{h->next=p1;h=p1;p1=p1->next;}
else if(p2->e<p1->e)
{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<i-1)
{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<i-1)
{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);/*输出单链表中结点的元素值*/
}


 

 

 

原创粉丝点击