链式结构线性表的实现

来源:互联网 发布:sql server设置外键 编辑:程序博客网 时间:2024/05/22 19:18

 链式结构线性表的实现

一、目的:

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

 

二、要求:

1、设链式存储线性表的数据类型定义如下

typedef char DataType;

typedef struct node {

    DataType data;

    Struct node *next;

} ListNode;

 带头结点的链表L是一个递增有序链表,按链接顺序,它们的值依次为

1、3、5、7、9、10、11、14

则经函数调用 Ex(L,5,10)后,链表 L中的元素依次是什么?

试指出函数完成什么工作。

void Ex(ListNode *L, DataType min, DataType max)

{     ListNode *p, *q, *r;

q = L; p = L->next; //链表L带头结点

while(p && p->data <= min) {

   q = p; p = p->next;

}

while(p && p->data < max) {

  r = p; p = p->next;free(r);

}

q->next = p;

}

 

2、设链式存储顺序表的数据类型定义如下,试指出以下函数完成什么工作。

如指针为 L的链表(带头结点)有10个元素,按链接顺序,它们的值依次为

                       4、3、4、5、3、6、4、7、3、5,

则经函数调用 Tp(L)后,链表 L中的元素依次是什么?

typedef char DataType;

typedef struct node {

    DataType data;

    Struct node *next;

} ListNode;

void Tp(ListNode *L)

{    ListNode *p, *q, *r;

for(p = L; p; p = p->next) 

for(q = p, r = q->next; r; r =q->next) 

 if (r->data != p->data)   q= r;

else {

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

    }

}

 

 

三、实验内容

调试程序。

 

四、实验报告要求

写出实验结果。

 

#include "stdio.h"
#include "stdlib.h"
#include "iostream.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 getlen(slink *head)
{slink *p;
int n;
p=head->next;n=0;
while(p!=NULL)
{n++;p=p->next;}
return n;
}

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");
}

//下面的算法是去掉有序链表中min和max之间的数据元素
void Ex(slink *L, int min, int max)
{     slink *p, *q, *r;
q = L; p = L->next; //链表L带头结点
while(p && p->data <= min) {
   q = p; p = p->next;
}
while(p && p->data < max) {
  r = p; p = p->next; free(r);
}
q->next = p;
}

//下面的算法是去掉算法中相同元素值的算法
void Tp(slink *L)
{     slink *p, *q, *r;
for(p = L; p; p = p->next) 
for(q = p, r = q->next; r; r = q->next) 
  if (r->data != p->data)   q = r;
else {
      q->next = r->next;  free(r); 
    }
}


void main()
{ slink *head;
int n,x,i,j,k;
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);/*输出单链表中结点的元素值*/
k=getlen(head);
printf("链表长度为:%d",k);
cout<<endl;
//Ex(head,5,10);
//printf("删除min和max之间的数据元素,最终的链表变成:");
//printlist(head);/*输出单链表中结点的元素值*/
Tp(head);
printf("去掉链表中相同数据元素的值,最终的链表变成:");
printlist(head);/*输出单链表中结点的元素值*/
}

 

 

 

原创粉丝点击