线性表的顺序表示与链式表示
数据结构课程实验报告
1
} } return(head); p1++; scanf("%ld",&p1->num);
//输出顺式线性表中的元素
void print(struct number*head)
{
}
//查找顺式线性表中的元素
void search(struct number *head)
{
struct number *p; long num1; int n=0,s=0; p=head; printf("\n请输入您要查找的数据:\n"); scanf("%ld",& num1); if(head!=0) for(;p->num!=0;p++) { n++; if(p->num==num1) { s=1; struct number *p; int s=L; p=head; if(p!=0) { } printf("\n您输入的数据为:\n"); for(;s>0;p++,s--) printf("%ld ",p->num);
2
} } } if(s==0) printf("\n没有您所要查找的数据\n"); else printf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n);
//插入顺式线性表的元素
struct number *insert(struct number*head)
{
}
//删除顺式线性表的元素
struct number *del(struct number*head)
{
struct number *p1,*p2; long num1; int n=1; struct number *p1,*p2; int n=1; long num1; p1=p2=head; p2=p2+L-1; printf("\n请输入您要插入的数据:\n"); scanf("%ld",&num1); if(num1num) { for(p1=head;p1->num=p1;p2--) } (p2+1)->num=num1; L++; return(head); (p2+1)->num=p2->num;
3
} printf("\n请输入要删除的数据:\n"); scanf("%ld",&num1); p2=p2+L-1; for(;p1->num!=num1 && nL) { } else { for(;p1num=(p1+1)->num; printf("\n没有您要删除的数据\n"); return(0); L--; return(head); }
struct list *creat_n()//创建有n个元素的链表
{
struct list *q,*p,*head=NULL;
printf("\n输入你所要创建的结点数: ");
scanf("%d",&length);
head=p=(list*)malloc(sizeof(list)); //创建一个新结点并用头指针指向它
printf("输入该结点的值: ");
scanf("%d", &p->data);
p->next=NULL;
for(int i=length-1;i>=1;i--)
{
q=p;
p=(list*)malloc(sizeof(list)); //创建新结点
printf("输入该结点的值: ");
4
scanf("%d", &p->data);
q->next=p;
}
printf("输入完毕\n\n");
p->next=NULL;
return head;
}
struct list * output()//输出表长与结点值函数
{
struct list *p;
p=head;
printf("\n当前链表中存有的元素:\n");
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
printf("当前的表长是: %d\n\n",length);//输出当前表长 return head;
}
void insert()//插入结点函数
{
struct list *k,*p,*q;
int x;
printf("请输入你要在哪个结点值之前插入新结点: ");
scanf("%d",&x);
k=(list*)malloc(sizeof(list));//创建新结点
printf("请输入新结点的值: ");
scanf("%d",&k->data);
5
k->next=NULL;
if(head==NULL)//若链表为空,则直接入链表
{
head=k;
length=length+1;
printf("插入成功\n\n");
}
else if(head->data==x)//在第一个结点前插入新结点
{
k->next=head;
head=k;
printf("插入成功\n\n");
length=length+1;
}
else
{
q=head;
p=head->next;
while((p != NULL) && (p->data != x))//找出值为X的结点的位置 {
q = p;
p = p->next;
}
if (p == NULL)
{
q->next=k;//在链表末插入新结点
printf("插入成功\n");
length=length+1;
}
else if(p->data == x)//在要求的X结点前插入新结点
{
k->next=p;
q->next=k;
printf("插入成功\n\n");
6
length=length+1;
}
}
output();
}
int delet()//删除结点函数
{
struct list *q,*p;
int x,y;
printf("请输入你所要删除的结点值: ");
scanf("%d",&x);
if(head==NULL)//表空
{
printf("表空\n");
return 0 ;
}
else if(x==head->data)//第一个结点为删除的结点 {
q=head;
head=head->next;
y=q->data;
free(q);
printf("删除成功\n\n");
length=length-1;
output();
return(y);
}
7
else
{
q=head;
p=head->next;
while((p != NULL) && (p->data != x))//找出值为X的结点 {
q=p;
p=p->next;
}
if(p==NULL)
{
printf("没有删除对象\n");
}
if(x==p->data)//删除值为X的结点
{
q->next=p->next;
y=p->data;
free(p);
printf("删除成功\n\n");
length=length-1;
output();
return (y);
}
else
{
printf("表中没有指定的结点\n");
output();
return 0;
}
}
return 0;
}
8
9
10
11
12
{
struct number *head,*p1;
p1=head=(struct number*)malloc( SIZE * sizeof(struct number));
scanf("%ld",&p1->num);
for(;p1->num!=0;L++)
{
p1++;
scanf("%ld",&p1->num);
}
return(head);
}
//输出顺式线性表中的元素
void print(struct number*head)
{
struct number *p;
int s=L;
p=head;
if(p!=0)
{
printf("\n您输入的数据为:\n");
for(;s>0;p++,s--)
printf("%ld ",p->num);
}
}
//查找顺式线性表中的元素
void search(struct number *head)
{
struct number *p;
long num1;
int n=0,s=0;
p=head;
printf("\n请输入您要查找的数据:\n");
scanf("%ld",& num1);
if(head!=0)
for(;p->num!=0;p++)
{
n++;
if(p->num==num1)
{
s=1;
break;
13
}
}
if(s==0)
printf("\n没有您所要查找的数据\n"); else
printf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n);
}
//插入顺式线性表的元素
struct number *insert(struct number*head)
{
struct number *p1,*p2;
int n=1;
long num1;
p1=p2=head;
p2=p2+L-1;
printf("\n请输入您要插入的数据:\n");
scanf("%ld",&num1);
if(num1num)
{
for(p1=head;p1->num
n++;
for(;p2>=p1;p2--)
(p2+1)->num=p2->num;
}
(p2+1)->num=num1;
L++;
return(head);
}
//删除顺式线性表的元素
struct number *del(struct number*head)
{
struct number *p1,*p2;
long num1;
int n=1;
p1=p2=head;
printf("\n请输入要删除的数据:\n");
scanf("%ld",&num1);
p2=p2+L-1;
for(;p1->num!=num1 && n
n=n+1;
if(n>L)
14
{
printf("\n没有您要删除的数据\n");
return(0);
}
else
{
for(;p1
p1->num=(p1+1)->num;
L--;
return(head);
}
}
void main()
{
struct number *head,*head1,*head2;
int a;
/*head=creat();
print(head);*/
printf("\n************************************\n"); printf(" *****************\n");
printf(" ** 1 创建链表 **\n");
printf(" ** 2 插入节点 **\n");
printf(" ** 3 查找数据 **\n");
printf(" ** 4 删除结点 **\n");
printf(" ** 5 输出 **\n");
printf(" ** 0 退出 **\n");
printf(" *****************\n");
printf("*************************************\n");
scanf("%d",&a);
while(a!=0)
{
switch(a)
{
case 1:printf("请创建顺序表:"); head=creat();break; case 2:head1=insert(head);break;
case 3:search(head);break;
case 4:head2=del(head);break;
case 5:print(head);
case 0:break;
}
printf("\n继续操作请输入,否则请按0退出:\n");
15
scanf("%d",&a);
}
}
#include
#include
#include
struct list //结点类型
{ int data;
struct list *next;
};
struct list *head;//声明结点指针
int static length;//声明表长变量
struct list *creat_n()//创建有n个元素的链表
{
struct list *q,*p,*head=NULL;
printf("\n输入你所要创建的结点数: ");
scanf("%d",&length);
head=p=(list*)malloc(sizeof(list)); //创建一个新结点并用头指针指向它
printf("输入该结点的值: ");
scanf("%d", &p->data);
p->next=NULL;
for(int i=length-1;i>=1;i--)
{
q=p;
p=(list*)malloc(sizeof(list)); //创建新结点
printf("输入该结点的值: ");
scanf("%d", &p->data);
q->next=p;
}
printf("输入完毕\n\n");
p->next=NULL;
return head;
}
16
struct list * output()//输出表长与结点值函数
{
struct list *p;
p=head;
printf("\n当前链表中存有的元素:\n");
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
printf("当前的表长是: %d\n\n",length);//输出当前表长 return head;
}
void insert()//插入结点函数
{
struct list *k,*p,*q;
int x;
printf("请输入你要在哪个结点值之前插入新结点: ");
scanf("%d",&x);
k=(list*)malloc(sizeof(list));//创建新结点
printf("请输入新结点的值: ");
scanf("%d",&k->data);
k->next=NULL;
if(head==NULL)//若链表为空,则直接入链表
{
head=k;
length=length+1;
printf("插入成功\n\n");
}
else if(head->data==x)//在第一个结点前插入新结点
{
k->next=head;
head=k;
printf("插入成功\n\n");
length=length+1;
}
else
{
q=head;
p=head->next;
17
while((p != NULL) && (p->data != x))//找出值为X的结点的位置 {
q = p;
p = p->next;
}
if (p == NULL)
{
q->next=k;//在链表末插入新结点
printf("插入成功\n");
length=length+1;
}
else if(p->data == x)//在要求的X结点前插入新结点
{
k->next=p;
q->next=k;
printf("插入成功\n\n");
length=length+1;
}
}
output();
}
int delet()//删除结点函数
{
struct list *q,*p;
int x,y;
printf("请输入你所要删除的结点值: ");
scanf("%d",&x);
if(head==NULL)//表空
{
printf("表空\n");
return 0 ;
}
else if(x==head->data)//第一个结点为删除的结点
{
q=head;
head=head->next;
18
y=q->data;
free(q);
printf("删除成功\n\n");
length=length-1;
output();
return(y);
}
else
{
q=head;
p=head->next;
while((p != NULL) && (p->data != x))//找出值为X的结点 {
q=p;
p=p->next;
}
if(p==NULL)
{
printf("没有删除对象\n");
}
if(x==p->data)//删除值为X的结点
{
q->next=p->next;
y=p->data;
free(p);
printf("删除成功\n\n");
length=length-1;
output();
return (y);
}
else
{
printf("表中没有指定的结点\n");
output();
return 0;
}
}
19
return 0;
}
void find()
{
struct list *p;
int k,x,i=1;
char y,n;
LOOP:
p=head;
printf("请输入你要查找的结点值: ");
scanf("%d",&x);
while(p->data!=x)
{
p=p->next;
i++;
}
printf("你所查找的结点是表中第 %d 个结点!\n\n",i); printf("是否要继续查找,请输入y/n\n\n");
k=getch();
if(k=='y')
{
i=1;
goto LOOP;
}
else
return;
}
void main()
{
int a;
LOOP:
printf(" *****************\n");
printf(" ** 1 创建链表 **\n");
printf(" ** 2 链表输出 **\n");
printf(" ** 3 插入结点 **\n");
printf(" ** 4 删除结点 **\n");
printf(" ** 5 查找结点 **\n");
20
21