- 单链表有带头结点时,其next域指向链表第一个结点的存储地址。
- 头结点的数据域可以不存储任何信息,也可以存放特殊信息。
代码中,lnode和*linklist说明:
- 定义指针时,lnode *p ==linklist p;
动态申请一个节点空间
- s=(linklist)malloc(sizeof(lnode))
- 需要头文件声明#include<stdlib.h>
数据结构第三次实验【实验说明】
(1 ) 建立链表是从无到有地建立起一个链表, 既一个一个地输入各节点数据,井建立起前后相互链接的关系.
(2) 显示链表是将链表中各节点的数据依次显示。设一个指针变量p, 先指向第1 个节点,显示p 所指的节点, 再显示p 后一个节点,直到链表尾节点。
(3) 删除链表中的节点是从p 指向第1个节点开始, 检查该节点的数据是否等于要删除的数据,如果相等就将该节点删除, 如不相等,则将p 后移一个节点,如此进行下去, 直到表尾为止。
(4) 插入节点是将个节点插入到己知的链表中,且保持节点的数据按原来的次序排列。
#include<stdio.h>
#include<stdlib.h>
typedef struct linknode{
int data;
struct linknode *next;
}lnode,*linklist;
//尾插法建表
void greatelist(linklist head,int n){
linklist s,last;//last指尾结点
int i;
last=head;//开始时lasr指向头结点
printf("输入%d个元素\n",n);
for(i=0;i<n;i++){
s=(linklist)malloc(sizeof(lnode));//生成新结点
scanf("%d",&s->data);//一定记得加取地址符号
s->next=NULL;
last->next=s;
last=s;//last指向s
}
}
/*头插法 逆位输入n个元素的值,建立带头结点的单链表L
void createlist(linklist &L,int n)
{
linklist p;
int i;
L=(linklist)malloc(sizeof(Lnode));
L->next=NULL;
printf("请输入结点值:");
for(i=1;i<=n;i++)
{
p=(linklist)malloc(sizeof(Lnode));
scanf("%d",&(p->data));
p->next=L->next;
L->next=p;
}
}*/
//显示链表
void displist(linklist head){
linklist p;
p=head->next;//p指向链表第一个结点
while(p!=NULL){//while(p)
printf("%3d",p->data);//p不为空时输出其数据域
p=p->next;//
}
}
//按位置删除
void dellist(linklist head,int i){
int j=0;
int x;
linklist p,s;
p=head;//总是定义一个指针指向新结点
while(p->next!=NULL&&j<i-1){//删除结点的下标
p=p->next;
j++;
}
if(p->next!=NULL&&j==i-1){//此时p->next为删除的位置结点
s=p->next;//用s表示要删除结点
x=s->data;//变量x存放数据方便带回
p->next=s->next;//与删除结点之后的结点联系
free(s);//释放结点空间
printf("删除%d位置上的%d值成功\n",i,x);
}
else
printf("errer/n");
}
//插入结点
void inslist(linklist head,int i,int x){
int j=0;
linklist p,s;
p=head;
while(p->next!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p!=NULL){//p不为空则新节点插入p后
s=(linklist)malloc(sizeof(lnode));//生成新节点
s->data=x;//新结点存放插入的值
s->next=p->next;//1
p->next=s;//2 1 2语句不可换
printf("插入元素成功\n");
}
else
printf("error");
}
main(){
linklist head;
int n,i,i1,x;
head=(linklist)malloc(sizeof(lnode));//初始化
head->next=NULL;//空链表
printf("输入建立线性表的长度\n");
scanf("%d\n",&n);
greatelist(head,n);
printf("显示链表数据:");
displist(head);
printf("\n");
printf("输入删除的元素位置:");
scanf("%d",&i);
dellist(head,i);
printf("输入插入的位置:");
scanf("%d",&i1);
printf("输入插入元素值:");
scanf("%d",&x);
inslist(head,i1,x);
displist(head);
return 0;
}