文档库

最新最全的文档下载
当前位置:文档库 > 带头结点单链表中数据就地逆置

带头结点单链表中数据就地逆置

实验3 :带头结点单链表中数据就地逆置

一、实验目的:

1. 会定义单链表的结点类型;

2. 熟悉对单链表的一些基本操作和具体的函数定义;

3. 了解和掌握单链表的调用格式。

二、实验要求:

1. 认真阅读和掌握实验内容所给的程序,并上机运行;

2. 保存程序运行结果,并结合程序进行分析;

3. 尝试自己调试修改程序并试运行。

三、实验内容:

编写算法实现带头结点单链表的就地逆置,即利用原带头结点单链表的结点空间把数据元素序列逆置。

四、实验程序:

#include

#include

#include

typedef int datatype;

typedef struct snode

{

datatype data;

struct snode*next;

}slnode;

sllinitiate(slnode**head);

linlistsort(slnode*head);

int sllinsert(slnode*head,int i,datatype x);

int slldelete(slnode*head,int i,datatype x);

int sllget(slnode*head,int i,datatype*x);

int sllnotempty(slnode*head);

linlistsurt(slnode*head);

linlistinsert(slnode*head,datatype x);

converse(slnode*head);

main(void)

{

datatype test[6]={64,6,7,89,12,24};

slnode*head,*p;

int n=6,i;

sllinitiate(&head);

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

sllinsert(head,i,test[i-1]);

linlistsort(head);

linlistinsert(head,25);

converse(head);

p=head->next;

while(p!=NULL)

{

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

p=p->next;

}

}

sllinitiate(slnode**head)

{

if((*head=(slnode*)malloc(sizeof(slnode)))==NULL)exit(1); (*head)->next=NULL;

}

int sllinsert(slnode*head,int i,datatype x)

{

slnode*p,*q;

int j;

p=head;j=0;

while(p!=NULL&&j

{

p=p->next;j++;

}

if(j!=i-1)

{

printf("the insert-position parameter is wrong!\n"); return 0;

}

if((q=(slnode*)malloc(sizeof(slnode)))==NULL)exit(1); q->data=x;

q->next=p->next;p->next=q;

return 1;

}

int slldelete(slnode*head,int i,datatype x)

{

slnode*p,*q;

int j;

p=head;j=0;

while(p->next!=NULL&&j

{

p=p->next;j++;

}

if(j!=i-1)

{

printf("the delete-position parameter is wrong!\n"); return 0;

}

q=p->next;p->next=p->next->next;

x=q->data;

free(q);

return 1;

}

int sllget(slnode*head,int i,datatype*x)

{

slnode*p;

int j;

p=head;j=0;

while(p->next!=NULL&&j

{

p=p->next;j++;

}

if(j!=i)

{

printf("the get-position parameter is wrong!\n"); return 0;

}

*x=p->data;

return 1;

}

int sllnotempty(slnode*head)

{

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

else return 1;

}

linlistsort(slnode*head)

{

slnode*curr,*pre,*p,*q;

head->next=NULL;

while(p!=NULL)

{

curr=head->next;

pre=head;

while(curr!=NULL&&curr->data<=p->data)

{

pre=curr;

curr=curr->next;

}

q=p;

p=p->next;

q->next=pre->next;

pre->next=q;

}

}

linlistinsert(slnode*head,datatype x)

{

slnode*curr,*pre,*q;

curr=head->next;

pre=head;

while(curr!=NULL&&curr->data<=x)

{

pre=curr;

curr=curr->next;

}

if((q=(slnode*)malloc(sizeof(slnode)))==NULL)exit(1);

q->data=x;

q->next=pre->next;

}

converse(slnode*head) {

slnode*p,*q;

p=head->next;

head->next=NULL; while(p!=NULL)

{

q=p;

p=p->next;

q->next=head->next;

head->next=q;

}

}