双向链表操作Word文档格式.docx

上传人:b****4 文档编号:8312554 上传时间:2023-05-11 格式:DOCX 页数:17 大小:19.90KB
下载 相关 举报
双向链表操作Word文档格式.docx_第1页
第1页 / 共17页
双向链表操作Word文档格式.docx_第2页
第2页 / 共17页
双向链表操作Word文档格式.docx_第3页
第3页 / 共17页
双向链表操作Word文档格式.docx_第4页
第4页 / 共17页
双向链表操作Word文档格式.docx_第5页
第5页 / 共17页
双向链表操作Word文档格式.docx_第6页
第6页 / 共17页
双向链表操作Word文档格式.docx_第7页
第7页 / 共17页
双向链表操作Word文档格式.docx_第8页
第8页 / 共17页
双向链表操作Word文档格式.docx_第9页
第9页 / 共17页
双向链表操作Word文档格式.docx_第10页
第10页 / 共17页
双向链表操作Word文档格式.docx_第11页
第11页 / 共17页
双向链表操作Word文档格式.docx_第12页
第12页 / 共17页
双向链表操作Word文档格式.docx_第13页
第13页 / 共17页
双向链表操作Word文档格式.docx_第14页
第14页 / 共17页
双向链表操作Word文档格式.docx_第15页
第15页 / 共17页
双向链表操作Word文档格式.docx_第16页
第16页 / 共17页
双向链表操作Word文档格式.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

双向链表操作Word文档格式.docx

《双向链表操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《双向链表操作Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。

双向链表操作Word文档格式.docx

  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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2