数据结构严蔚敏版复习1.1——单链表基础操作
基础复盘,还有很多不足
插入一个数
x->next=p->next;(这里p指向的是7)
p->next=x;
删除
p一直往前走,不断和q比较
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}Lnode,*Linklist;
//单链表初始化,定义一个Linklist(Lnode*)型函数,由其带回头指针地址
Linklist InitList()
{
Lnode *L;
L=(Lnode*)malloc(sizeof(Lnode));
if(L==NULL)
{
printf("申请空间失败\n");
exit(0);
}
L->next ==NULL;
return L;
}
//尾插法创建单链表
void CreatList(Linklist L)
{
Lnode *s,*r=L;
int i,n,num;
printf("请输入元素个数n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&num);
s=(Lnode*)malloc(sizeof(Lnode));
s->data =num;
r->next=s;
r=s;
}
r->next=NULL;
}
//判断单链表长度
int LongthList(Linklist L)
{
int i=0;
Lnode *p;
p=L->next;//带头结点的单链表,头结点按第0个节点算
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
//在链表的第i个位置之后插入元素x
int Insert(Linklist L,int i,int x)
{
int j;
Lnode *s,*r=L;
if(i<0||i>LongthList(L))
{
printf("插入位置错误\n");
return 0;
}
s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
for(j=0;j<i;j++)
//定位;若要在第i个元素之前插入,则j=1;(或者j=0,j<i-1;)少循环一次就可以了
{
r=r->next;
}
s->next=r->next;
r->next=s;
}
//删除第i个节点,并释放
int DeleteLnode(Linklist L,int i,int &x)
{
Lnode *q, *p=L;
int j=0;
if(i<0||i>LongthList(L))
{
printf("删除位置错误\n");
return 0;
}
while(p&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
x=q->data;//如果不加取地址符,直接free
free(q);
}
//遍历单链表
void PrintList(Linklist L)
{
Lnode *p;
p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
//将单链表中最小的数输出
int SelectMin(Linklist L,int &x)
{
Lnode *p,*q;
p=L->next;
q=p;//假设第一个数为最小
while(p!=NULL)
{
if(q->data>p->data)
{
q=p;
}
p=p->next;
}
return q->data;
}
int main()
{
Linklist S;int l,x;
S=InitList();
CreatList(S);
l=LongthList(S);
printf("链表长为%d\n",l);
PrintList(S);
Insert(S,2,4);
printf("插入新元素之后,遍历\n");
PrintList(S);
DeleteLnode(S,3,x);
printf("%d已经删除\n",x);
printf("删除元素之后,遍历\n");
PrintList(S);
SelectMin(S,x);
printf("最小的数是%d\n",x);
}