Exercise
结点结构:数据域+指针域
结构体定义:
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
1.创建单链表
//单链表:带头结点的头插法
LinkList Head_InsertNode(LinkList &L)
{
Lnode *p;
int x;
L=(Lnode *)malloc(sizeof(Lnode));//头结点
L->next=null;
scanf("%d",&x);//输入结点的值
while(x!=9999)//null
{
p=(Lnode *)malloc(sizeof(Lnode));//创建新结点
p->next=L->next;
L->next=p
p.data=x;
scanf("%d",&x);
}
return L;
}
//不带头结点的头插法
LinkList Head_InsertNode(LinkList &L)
{
LinkList L;//指向单链表的指针
L->next=null;
Lnode *p;//工作指针
int x;
scanf("%d",&x);
//第一个结点
p=(Lnode *)malloc(sizeof(Lnode));
L->next=p;
p->data=x;
L=P;
scanf("%d",&x);
while(x!=9999)//其他结点
{
p=(Lnode *)malloc(sizeof(Lnode));//新结点
p->next=L->next;
p->data=x;
L->next=p;
scanf("%d",&x);
}
return L;
}
2.按位查找(带头结点)
给定一个位序i,找不到就返回null
Lnode * GetElem(LinkList L,ElemType i)
{
if(i<1)
return null;//输入位置无效
int j=1;//计数
Lnode *p=L->next;
while(i<j&&p!=null)
{
p=p->next;
j++;
}
return p;
}
3.按值查找(带头结点)
按照给定的值e查找,找到就返回指针
Lnode * LocateElem(LinkList L,ElemType e)
{
Lnode *p=L->next;
while(p!=null&&p->data!=e)
{
p=p->next;
}
return p;
}
4.指定节点的插入,在p结点前插入s
前插:如果在p结点前插入,则需要循环找到p的前驱
后插:插入一个新结点,再将两个结点的数据交换即可,无需遍历链表
//exp:后插
bool InsertPirorNode(Lnode *p,Lnode *s)
{
if(p==null)
return false;//
if(s==null)
return false;//内存分配失败
Lnode *s=(Lnode *)malloc(sizeof(Lnode));
s->next=p->next;
p->next=s;
s->data=L->data;
L->data=e;
return true;
}
5.删除结点
先判断删除位置是否合理,再删除即释放不用的结点
//按位序i删除指定值e
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)
return false;
Lnode *p=L->next;//指向头结点
int j=1;
while(p!=null&&j<i)
{
p=p->next;
j++;//找到i
}
//找到了i以后判断删除位置是否合理
if(p==null)
return false;//
if(p->next==null)
return false;//到了表尾,最后一位不删
//删除
Lnode *q=P->next;//q指向被删除结点
p->next=q->next;
//p->next=p->next->next;
free(q);
return ture;
}
6.求表长
//带头结点
int length(LinkList L)
{
int len=0;
Lnode *p=L;//指向表头
while(p->next!=null)
len++;
return len;
}
//不带头结点
int length(LinkList L)
{
int len=1;//先+1,后+1都可??
Lnode *p=L->next;//指向表头
while(p->next!=null)
len++;
return len;
}
习题总结
1.使用指针可以很方便地表示各种逻辑结构
2.在链表的末尾插入和删除一个结点时,需要修改其相邻结点的指针域,而寻找尾结点及其前驱结点时,只有带头结点的双循环链表所需的时间最少。
3.循环单链表,头指针head,有head->next->next==head,则线性表长度为?
易知可为1,同时,如果是一个空表,因为head->next=head,而head->next=head,上式也成立。因此表长可为1也可为0
4.断链:如果链表前后有指针指示,不会因为语序的不同而造成断链。
5.带头结点的单链表,结构为data:link
只给出头指针list,在不改变链表的前提下,查找倒数为k的位置上的结点data,成功就输出data值,并返回1,否则,返回0
思考:什么情况下会查找失败?
当k>count时,会失败
typedef struct Lnode()
{
ElemType data;
struct Lnode *link;
}Lnode, *Linklist;
int search(Linklist &L,int k)
{
Lnode *p=link->link;*q=list->link;//q定位到末尾,p指示k的位置
int count=0;
while(q!=null)//遍历链表
{
if(count>=k)//当移动到正序的k位置时,p也开始移动
p=p->link;
q=q->link;
count++;
}
if(k>count)
return 0;
printf("%d",p->data);
return 1;
}
未完待续…