1.实验内容
(1)用头插法(或尾插法)建立带头结点的单链表,
(2)对已建立的单链表实现插人、删除、查找等基本操作。
2.实现提示
首先,将单链表中的结点定义为如下结构类型:
typedef int ElemType;
typedef struct LNode {
ElemType data; struct LNode *next;
} LNode;
typedef struct LNode *LinkList;
3.实验源码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 5
#define ERROR 0
#define OK 1
typedef struct node{
int data;
struct node *next;
}linklist;
linklist *Initlist()
{
linklist *head;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
return head;
}
linklist *CreateList(int n)
{
int i;
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
for(i=1;i<=n;i++) {
p=(linklist*)malloc(sizeof(linklist));
p->next=NULL;
scanf("%d",&p->data);
r->next=p;
r=r->next;
}
return head;
}
linklist *CreateList2(int n)
int i;
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
for(i=n-1;i>=0;--i){
p=(linklist*)malloc(sizeof(linklist));
p->next=NULL;
scanf("%d",&p->data);
p->next=r->next;
r->next=p;
}
return head;
}
void printlist(linklist *head)
linklist *p;
int i=1;
p=head->next;
while(p!=NULL) {
printf("%d\t",p->data);
p=p->next;
i++; }
printf("\n");
}
void listlength(linklist *head)
int count=0;
linklist *p;
p=head->next;
while(p!=NULL) {
count++;
p=p->next;
}
printf("链表的长度为%d\n",count);
}
int insertlist(linklist *head,int i,int x)
int j;
linklist *p,*s;
p=head;
j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL||i<1)
return ERROR;
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
s->next=p->next;
p->next=s;
return OK;
}
int deletelist(linklist *head,int i)
{
int j;
linklist *p,*q;
p=head;j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
} if(p==NULL||i<1)
return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}int locatelink(linklist *head,int x)
linklist *p;
int j;
p=head->next;
j=1;
while(p!=NULL&&p->data!=x) {
p=p->next;
j++; }
printf("所输入元素的位置为:%d",j);
if(p==NULL) return ERROR;
else return j;
}int clearlist(linklist *head)
linklist *p,*q;
p=head->next;
head->next=NULL;
while(p!=NULL) {
q=p;
p=p->next;
free(q);
}
return 1;
}
int main(){
int i,a,x,n,m;
linklist *head,*head1;
printf("请输入要构建的链表的长度(尾插法):\n");
scanf("%d",&n);
head=CreateList(n);
printf("输入的元素构成的链表输出为:\n");
printlist(head);
listlength(head);
printf("请输入要定位的元素:\n");
scanf("%d",&x); locatelink(head,x);
printf("\n请输入要插入元素的位序(插入的数固定为10)\n");
scanf("%d",&m);
insertlist(head,m,10);
printf("重新输出插入元素10的链表:\n");
printlist(head);
printf("请输入要删除元素的位序:\n");
scanf("%d",&i);
deletelist(head,i);
printf("重新输出删除元素的链表:\n");
printlist(head);
printf("\n请输入要构建的链表的长度(头插法):\n");
scanf("%d",&a);
head1=CreateList2(a);
printf("输入的元素构成的链表输出为:\n");
printlist(head1);
listlength(head1);
return 0;
}