一、【实验目的】
1、掌握建立单链表的基本方法。
2、掌握单链表的插入、删除算法的思想和实现
二、【实验内容】
仿照教材中的单链表实现例子,自己设计一个有序单链表,单链表中的数据元素为整型并递增有序。有序单链表的定义:
逻辑结构:有序线性表,数据元素递增有序
存储结构:链式
操作集合:初始化、插入、删除、撤销
(1)ListInitiate(L) 初始化线性表,生成一个空表L。
(2)ListInsert(L,x) 在有序表L中插入数据元素x,使得新表仍然有序。
(3)ListDelete(L,x) 删除有序表L中的数据元素x,若删除成功则返回1,不成功则返回0。
(4)Destroy(L) 撤销单链表
要求:
1.有序单链表的操作集合有如下操作:初始化、插入、删除、撤销,使用头文件单链表的代码。
2.编写主函数main()验证所设计的有序单链表是否能正确插入、删除。
提示:
1.插入操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;否则就找到了插入结点的合适位置,此时申请新结点把x存入,然后把新结点插入;当比较到最后一个结点仍有data小于等于x时,则把新结点插入单链表尾。
2.删除操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data不等于x时,进行下一个结点的比较;否则就找到了要删除的结点,删除结点后释放结点。如果到了表尾还没有找到值为x的结点,则链表中没有要删除的元素。
三、实验源代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#include"LinkedList.h"
void main()
{
SingleLinkedList *head;
int i,a,b,c;
ListInitialize(&head);/*初始化链表*/
for(i=0;i<26;i++)
ListInsert(head,i,i+1);
printf("链表已生成:\n");
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&a);
printf("%d ",a);
}
/*链表插入操作*/
printf("\n请输入你要插入的数字:\n");
scanf("%d",&c);
ListSortInsert(head,c);
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&a);
printf("%d ",a);
}
/*链表删除操作*/
printf("\n");
printf("请输入删除元素:\n");
scanf("%d",&b);
if(ListDelete(head,b)==1)
{
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&a);
printf("%d ",a);
}
}
else
printf("No!");
ListDestroy(&head);
}
头文件
typedef struct SingleNode
{
ElemType data;
struct SingleNode *next;
} SingleLinkedList,*LinkList;
SingleLinkedList *head;
void ListInitialize (SingleLinkedList * *head)
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if ((*head=(SingleLinkedList*)malloc(sizeof(SingleLinkedList)))==NULL) exit (1);
(*head) ->next=NULL; /*置链尾标记NULL*/
}
int ListLength(SingleLinkedList *head)
{
SingleLinkedList *p=head;
int size=0;
while(p->next!=NULL)
{
p=p->next ;
size++;
}
return size;
}
int ListInsert (SingleLinkedList * head, int i, ElemType x)
{
/*在带头结点的单链表head的数据元素a.(0<i<size)
/*插入一个存放数据元素x的结点*/
SingleLinkedList *p,*q;
int j;
p=head; /*p 指向头结点*/
j=-1; /*j初始为-1*/
while (p->next!=NULL && j<i-1) /*最终让指针p指向a结点*/
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置参数错!");
return 0;
}
/*生成新结点由指针q指示*/
if ((q=(SingleLinkedList *) malloc (sizeof (SingleLinkedList)))==NULL)
exit (1);
q->data=x;
q->next=p->next; /*给指针 q->next 赋值*/
p->next=q; /* 给指针 p->next 重新赋值*/
return 1;
}
int ListGet(SingleLinkedList *head,int i,ElemType *x)
{
SingleLinkedList *p;
int j;
p=head;
j=-1;
while(p->next !=NULL&&j<i)
{
p=p->next ;
j++;
}
if(j!=i)
{
printf("取元素位置参数错误!");
return 0;
}
*x=p->data ;
return 1;
}
void ListSortInsert(SingleLinkedList *head,ElemType x)
{
SingleLinkedList *curr,*pre,*q;
curr=head->next ;
pre= head;
while(curr!=NULL&&curr->data <=x)
{
pre=curr;
curr=curr->next ;
}
q=(SingleLinkedList*)malloc(sizeof(SingleLinkedList));
q->data =x;
q->next =pre->next ;
pre->next =q;
}
void ListDestroy(SingleLinkedList **head)
{
SingleLinkedList *p,*p1;
p=*head;
while(p!=NULL)
{
p1=p;
p=p->next ;
free(p1);
}
*head=NULL;
}
int ListDelete(SingleLinkedList *head,int x)
{
SingleLinkedList *p,*q;
p=head;
while(p->next!=NULL)
{
if(p->next->data==x)
{
break;
}
p=p->next;
}
if(p->next==NULL)
return 0;
else
{
q=p->next;
p->next=p->next->next;
free(q);
return 1;
}
}
四 实验结果