一、【实验目的】
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的结点,则链表中没有要删除的元素。
源代码
头文件
typedef struct SingleNode
{
ElemType data;
struct SingleNode *next;
}SingleLinkedList;
void ListInitiate(SingleLinkedList **head)
{
if((*head = (SingleLinkedList*)malloc(sizeof(SingleLinkedList)))==NULL)
exit(1);
(*head)->next = NULL;
}
void ListInsert(SingleLinkedList *head,ElemType x)
{
SingleLinkedList *p, *q,*h;
p = head->next;
q = head;
while(p!=NULL&&p->data <=x)
{
q = p;
p = p->next;
}
h = (SingleLinkedList*)malloc(sizeof(SingleLinkedList));
h-> data = x;
h->next = q->next;
q->next = h;
}
int ListDelete(SingleLinkedList *head,ElemType 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;
}
}
void Destroy(SingleLinkedList **head)
{
SingleLinkedList *p, *q;
p = *head;
while(p != NULL)
{
q = p;
p = p->next;
free(q);
}
*head = NULL;
}
int listlength(SingleLinkedList *head)
{
SingleLinkedList *p=head;
int size = 0;
while(p->next!=NULL)
{
p=p->next;
size++;
}
return size;
}
源文件
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#include"LinkedList.h"
int main(void)
{
SingleLinkedList *head,*p;
ListInitiate(&head);
int x,n,i,s,t,m;
printf("请选择输入多少个数字:");
scanf("%d",&n);
for(i = 0;i < n;i++)
{
printf("第%d个数字是:",i+1);
scanf("%d",&x);
ListInsert(head,x);
}
p=head;
for(i = 0;i < n;i++)
{
printf("%5d",p->next->data);
p=p->next;
}
printf("\n输入你要删除的数字:");
scanf("%d",&s);
m=ListDelete(head,s);
if(m=0)
printf("删除失败");
p=head;
t=listlength(head);
for(i = 0;i < t;i++)
{
printf("%5d",p->next->data);
p=p->next;
}
return 0;
}