双向链表操作Word文档格式.docx
《双向链表操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《双向链表操作Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
![双向链表操作Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/e8f06017-b439-4458-b553-3036f78e3b2d/e8f06017-b439-4458-b553-3036f78e3b2d1.gif)
printf("
请输入第%d个人的姓名"
i+1);
scanf("
%s"
s->name);
s->llink=p;
s->rlink=NULL;
p=s;
h->llink=s;
p->rlink=h;
return(h);
}
stud*search(stud*h,char*x)
stud*p;
char*y;
p=h->rlink;
while(p!
=h)
y=p->name;
if(strcmp(y,x)==0)
return(p);
elsep=p->rlink;
printf("
没有查找到该数据!
voidprint(stud*h)
intn;
数据信息为:
\n"
%s"
&
*(p->name));
p=p->rlink;
main()
intnumber;
charstudname[20];
stud*head,*searchpoint;
number=N;
clrscr();
head=creat(number);
print(head);
请输入你要查找的人的姓名:
scanf("
studname);
searchpoint=search(head,studname);
你所要查找的人的姓名是:
*&
searchpoint->name);
2、插入
对于双向循环链表,我们现在可以随意地在某已知结点p前或者p后插入一个新的结点。
假若s,p,q是连续三个结点的指针,若我们要在p前插入一个新结点r,则只需把s的右链域指针指向r,r的左链域指针指向s,r的右链域指针指向p,p的左链域指针指向r即可。
在p,q之间插入原理也一样。
下面就是一个应用双向循环链表插入算法的例子:
#include<string.h>
voidinsert(stud*p)
charstuname[20];
stud*s;
if((s=(stud*)malloc(sizeof(stud)))==NULL)
请输入你要插入的人的姓名:
stuname);
strcpy(s->name,stuname);
s->rlink=p->rlink;
p->rlink=s;
s->llink=p;
(s->rlink)->llink=s;
%s\n"
insert(searchpoint);
}
更多内容请看C/C++进阶技术文档专题,或
3、删除
删除某个结点,其实就是插入某个结点的逆操作。
还是对于双向循环链表,要在连续的三个结点s,p,q中删除p结点,只需把s的右链域指针指向q,q的左链域指针指向s,并收回p结点就完成了。
下面就是一个应用双向循环链表删除算法的例子:
#include
#defineN10
i〈n;
p-〉rlink=s;
voiddel(stud*p)
(p->rlink)->llink=p->llink;
(p->llink)->rlink=p->rlink;
free(p);
del(searchpoint);
实现一个双向链表,提供如下功能:
1.链表头插入节点;
2.链表尾插入节点;
3.链表中指定节点后面插入节点.
程序已测试通过,如有疑问再追问,希望对你有帮助
#include<
stdio.h>
malloc.h>
typedefstructdlink{
intdata;
structdlink*prior;
//前指针,指向前结点第一个结点prior=NULL
structdlink*next;
//后指针,指向后结点最后一个结点next=NULL
}LINK;
voidcrt_dlink(LINK*head,intn)//创建一个带头结点的双向链表,头结点为headn为数据结点个数
LINK*tail=head,*p;
inti=0;
for(i=0;
i<
n;
i++)
{
p=(LINK*)malloc(sizeof(LINK));
//申请一个结点空间
printf("
请输入第%2d个结点值:
i+1);
scanf("
%d"
&
p->
data);
tail->
next=p;
p->
prior=tail;
tail=p;
}
next=NULL;
voidshow_dlink(LINK*head)//显示链表
LINK*p=head->
next;
if(p==NULL)//空表
{
printf("
空表\n"
);
return;
}
正向遍历表:
while(p->
next)
%d->
p->
p=p->
%d\n"
p->
data);
反向遍历表:
while(p!
=head->
next)
prior;
%d\n\n"
voidappend_dlink(LINK*head,LINK*node)//在表尾增加一个结点
LINK*p=head;
while(p->
next)//找到尾结点其next=NULL
next;
next=node;
//将新结点插入tail后
node->
prior=p;
//新结点的前结点指向tail结点
//新结点的后结点指向NULL
voidadd_head_dlink(LINK*head,LINK*node)//在表头增加一个结点
//记录head的下一结点
head->
//将新结点插入head后
prior=head;
//新结点的前结点指向头结点
//新结点的后结点指向原head的后结点
prior=node;
//原第一个结点的前结点指向新结点
//在指定结点后增加一个结点,
//pos:
指定的第pos个结点
//pos=0时,相当于add_head_dlink()
//pos=max时,相当于append_dlink()
voidinsert_dlink(LINK*head,intpos,LINK*node)
LINK*p=head,*pp;
while(i++<
pos)
if(!
next)//到了表尾
break;
//指定的位置超过表长度,追加到表尾
pp=p->
//记录指定结点的后节点
//新结点插入指定结点后
//新结点的前结点指向p
next=pp;
//新结点的后结点指向原p的后结点
if(pp)//当在尾结点插入时,pp=p->
next=NULL
pp->
voidfree_dlink(LINK*head)//释放链表
LINK*p=head;
while(p)
head=p->
free(p);
p=head;
intmain()
LINK*head,*node;
intn=0,pos=0;
head=(LINK*)malloc(sizeof(LINK));
//申请头结点空间
prior=NULL;
do{
inputnumberofdatan(非0)="
);
n);
}while(n==0);
crt_dlink(head,n);
show_dlink(head);
node=(LINK*)malloc(sizeof(LINK));
输入新结点的值:
node->
append_dlink(head,node);
add_head_dlink(head,node);
do{
指定插入位置,负数退出:
pos);
if(pos<
0)
break;
insert_dlink(head,pos,node);
}while
(1);
free_dlink(head);
system("
pause"
return0;
用C编写一个函数Create(),该函数可以用于创建一个链表,链表中的结点包括学号、成绩,具有双向指针该函数返回链表的头指针。
1.动态输入学生人数(1-35)
(1)学号:
char型,5位数字,不足5位的前面补0,数字以外时要提示错误信息;
(2)成绩:
short型,最大值100大于100或者小于0或者数字以外时要提示错误信息
2.输入的信息超过相应位数时,只取前面相应位数的信息
/*
学生<
1>
的学号:
5670
的成绩:
999
90
0567090
请按任意键继续...
*/
stdlib.h>
string.h>
typedefstructnode{
charid[6];
shortscore;
structnode*next;
}*Node,*LinkList;
//去除id中的非数字字符,如果id长度大于slen,只取用前slen个,
//如果不足slen个字符,则在前端添加字符'
0'
。
char*StId(char*id,intslen){
char*q,*p=id;
inti,len=strlen(id);
for(i=0;
p[i];
++i){//删除非数字字符
if((p[i]<
'
)||(p[i]>
9'
)){
q=p+i;
while(*q=*(q+1))++q;
--i;
}
if(len>
=slen)id[slen]='
\0'
;
//截取
else{//长度不足则填'
for(i=0;
i<
=len;
++i)//往后移动
id[slen-i]=id[len-i];
slen-len;
++i)//填充字符'
id[i]='
returnid;
intStScore(char*s,intmin,intmax){
char*q,*p=s;
inti,num=0;
++i)num=10*num+p[i]-'
if((num<
min)||(num>
max))return-1;
returnnum;
LinkListCreateList(intn){//创建单向非循环链表
LinkListhead;
chars[20];
Nodep,q;
head=p=(LinkList)malloc(sizeof(node));
for(inti=0;
i<
n;
i++){
q=(LinkList)malloc(sizeof(node));
printf("
%d>
"
i+1);
scanf("
s);
strcpy(q->
id,StId(s,5));
do{
printf("
scanf("
q->
score=StScore(s,0,100);
}while(q->
score==-1);
p->
next=q;
p=q;
next=NULL;
returnhead;
voidPrintList(LinkListhead){
Nodep=head->
while(p){
%s\t%d\n"
id,p->
score);
p=p->
intmain(){
LinkListhead=CreateList
(1);
PrintList(head);
1、建立一个非空的双向链表,链表的节点要有两个数据域:
1).学生学号2).学生分数;
2、遍历双线链表,输出
structtest//结构体
unsignedintnumber;
intgrade;
structtest*next;
//指向下一个
structtest*previous;
//指向上一个
};
voidoutput1(structtest*p)//正顺输出函数
%u\t%d\n"
number,p->
grade);
p=p->
voidoutput2(str