ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:19.90KB ,
资源ID:11868437      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11868437.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(双向链表操作.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

双向链表操作.docx

1、双向链表操作双向链表的基本运算:1、查找假若我们要在一个带表头的双向循环链表中查找数据域为一特定值的某个结点时,我们同样从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。下例就是应用双向循环链表查找算法的一个程序。 #include stdio.h#include malloc.h#define N 10typedef struct nodechar name20;struct node *llink,*rlink;stud;stud * creat(int n)stud *p,*h,*s;int i;if(h=(stud *)malloc

2、(sizeof(stud)=NULL)PRintf(不能分配内存空间!);exit(0);h-name0=0;h-llink=NULL;h-rlink=NULL;p=h;for(i=0;in;i+)if(s= (stud *) malloc(sizeof(stud)=NULL)printf(不能分配内存空间!);exit(0);p-rlink=s;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

3、*x)stud *p;char *y;p=h-rlink;while(p!=h)y=p-name;if(strcmp(y,x)=0)return(p);else p=p-rlink;printf(没有查找到该数据!);void print(stud *h)int n;stud *p;p=h-rlink;printf(数据信息为:n);while(p!=h)printf(%s ,&*(p-name);p=p-rlink;printf(n);main()int number;char studname20;stud *head,*searchpoint;number=N;clrscr();head

4、=creat(number);print(head);printf(请输入你要查找的人的姓名:);scanf(%s,studname);searchpoint=search(head,studname);printf(你所要查找的人的姓名是:%s,*&searchpoint-name);2、插入对于双向循环链表,我们现在可以随意地在某已知结点p前或者p后插入一个新的结点。假若s,p,q是连续三个结点的指针,若我们要在p前插入一个新结点r,则只需把s的右链域指针指向r,r的左链域指针指向s,r的右链域指针指向p,p的左链域指针指向r即可。在p,q之间插入原理也一样。下面就是一个应用双向循环链表插

5、入算法的例子:#include stdio.h#include malloc.h#include string.h#define N 10typedef struct nodechar name20;struct node *llink,*rlink;stud;stud * creat(int n)stud *p,*h,*s;int i;if(h=(stud *)malloc(sizeof(stud)=NULL)printf(不能分配内存空间!);exit(0);h-name0=0;h-llink=NULL;h-rlink=NULL;p=h;for(i=0;in;i+)if(s= (stud

6、*) malloc(sizeof(stud)=NULL)printf(不能分配内存空间!);exit(0);p-rlink=s;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);else p=p-rlink;printf(没有查找到该数据!);vo

7、id print(stud *h)int n;stud *p;p=h-rlink;printf(数据信息为:n);while(p!=h)printf(%s ,&*(p-name);p=p-rlink;printf(n);void insert(stud *p)char stuname20;stud *s;if(s= (stud *) malloc(sizeof(stud)=NULL)printf(不能分配内存空间!);exit(0);printf(请输入你要插入的人的姓名:);scanf(%s,stuname);strcpy(s-name,stuname);s-rlink=p-rlink;p-

8、rlink=s;s-llink=p;(s-rlink)-llink=s;main()int number;char studname20;stud *head,*searchpoint;number=N;clrscr();head=creat(number);print(head);printf(请输入你要查找的人的姓名:);scanf(%s,studname);searchpoint=search(head,studname);printf(你所要查找的人的姓名是:%sn,*&searchpoint-name);insert(searchpoint);print(head); 更多内容请看C

9、/C+进阶技术文档专题,或 3、删除删除某个结点,其实就是插入某个结点的逆操作。还是对于双向循环链表,要在连续的三个结点s,p,q中删除p结点,只需把s的右链域指针指向q,q的左链域指针指向s,并收回p结点就完成了。下面就是一个应用双向循环链表删除算法的例子:#include #include #include #define N 10 typedef struct nodechar name20;struct node *llink,*rlink;stud;stud * creat(int n)stud *p,*h,*s;int i;if(h=(stud *)malloc(sizeof(st

10、ud)=NULL)printf(不能分配内存空间!);exit(0);h-name0=0;h-llink=NULL;h-rlink=NULL;p=h;for(i=0;in;i+)if(s= (stud *) malloc(sizeof(stud)=NULL)printf(不能分配内存空间!);exit(0);p-rlink=s;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

11、;char *y;p=h-rlink;while(p!=h)y=p-name;if(strcmp(y,x)=0)return(p);else p=p-rlink;printf(没有查找到该数据!);void print(stud *h)int n;stud *p;p=h-rlink;printf(数据信息为:n);while(p!=h)printf(%s ,&*(p-name);p=p-rlink;printf(n);void del(stud *p)(p-rlink)-llink=p-llink;(p-llink)-rlink=p-rlink;free (p);main()int numbe

12、r;char studname20;stud *head,*searchpoint;number=N;clrscr();head=creat(number);print(head);printf(请输入你要查找的人的姓名:);scanf(%s,studname);searchpoint=search(head,studname);printf(你所要查找的人的姓名是:%sn,*&searchpoint-name);del(searchpoint);print(head);实现一个双向链表,提供如下功能:1.链表头插入节点;2.链表尾插入节点;3.链表中指定节点后面插入节点.程序已测试通过,如有

13、疑问再追问,希望对你有帮助#include #include typedef struct dlink int data; struct dlink *prior; /前指针,指向前结点 第一个结点 prior=NULL struct dlink *next; /后指针,指向后结点 最后一个结点 next=NULL LINK ; void crt_dlink(LINK *head,int n)/创建一个带头结点的双向链表,头结点为head n为数据结点个数 LINK *tail=head , *p ; int i=0; for( i=0;idata ); tail-next=p; p-prio

14、r=tail; tail=p; tail-next=NULL; void show_dlink( LINK *head ) /显示链表 LINK *p=head-next; if ( p = NULL ) /空表 printf(空表n) ; return ; printf(正向遍历表:); while(p-next) printf(%d- , p-data ); p=p-next; printf(%dn,p-data); printf(反向遍历表:); while(p != head-next ) printf(%d- , p-data ); p=p-prior; printf(%dnn,p-

15、data);void append_dlink( LINK *head , LINK *node ) /在表尾增加一个结点 LINK *p=head ; while( p-next ) /找到尾结点 其next=NULL p=p-next ; p-next=node; /将新结点插入tail后 node-prior=p;/新结点的前结点指向tail结点 node-next=NULL;/新结点的后结点指向NULL void add_head_dlink( LINK *head , LINK *node ) /在表头增加一个结点 LINK *p=head-next ; /记录head的下一结点 h

16、ead-next=node; /将新结点插入head后 node-prior=head;/新结点的前结点指向头结点 node-next=p; /新结点的后结点指向原head的后结点 p-prior=node ;/原第一个结点的前结点指向新结点 /在指定结点后增加一个结点 , /pos:指定的第pos个结点/pos=0时,相当于add_head_dlink()/pos=max时,相当于append_dlink() void insert_dlink( LINK *head , int pos , LINK *node ) int i=0; LINK *p=head,*pp; while( i+

17、next ) /到了表尾 break; /指定的位置超过表长度,追加到表尾 p=p-next; pp=p-next; /记录指定结点的后节点 p-next=node; /新结点插入指定结点后 node-prior=p;/新结点的前结点指向p node-next=pp;/新结点的后结点指向原p的后结点 if ( pp ) /当在尾结点插入时,pp=p-next=NULL pp-prior=node ; void free_dlink( LINK *head ) /释放链表 LINK *p=head; while(p) head=p-next; free(p); p=head ; int main

18、() LINK *head,*node; int n=0,pos=0; head=(LINK *)malloc(sizeof(LINK) ); /申请头结点空间 head-prior=NULL; head-next=NULL; do printf(input number of data n(非0)= ); scanf( %d , &n ); while ( n=0 ); crt_dlink( head , n ); show_dlink( head ); node=(LINK *)malloc(sizeof(LINK); printf(输入新结点的值:); scanf( %d , &node

19、-data ); append_dlink( head , node ); show_dlink( head ); node=(LINK *)malloc(sizeof(LINK); printf(输入新结点的值:); scanf( %d , &node-data ); add_head_dlink( head,node ); show_dlink( head ); do printf(指定插入位置,负数退出: ); scanf( %d,&pos ); if ( pos data ); insert_dlink( head,pos,node ); show_dlink( head ); whi

20、le ( 1 ); free_dlink( head ); system(pause ); return 0; 用C编写一个函数Create(),该函数可以用于创建一个链表,链表中的结点包括学号、成绩,具有双向指针 该函数返回链表的头指针。1.动态输入学生人数(1-35)(1)学号:char型,5位数字,不足5位的前面补0,数字以外时要提示错误信息;(2)成绩:short型,最大值100大于100或者小于0或者数字以外时要提示错误信息 2.输入的信息超过相应位数时,只取前面相应位数的信息/*学生的学号 : 5670学生的成绩 : 999学生的成绩 : 9005670 90请按任意键继续. .

21、.*/#include #include #include typedef struct node char id6; short score; struct node *next;*Node,*LinkList;/ 去除id中的非数字字符,如果id长度大于slen,只取用前slen个,/ 如果不足slen个字符,则在前端添加字符0。 char *StId(char *id, int slen) char *q,*p = id; int i,len = strlen(id); for(i = 0; pi; +i) / 删除非数字字符 if(pi 9) q = p + i; while(*q =

22、 *(q + 1) +q; -i; if(len = slen) idslen = 0; / 截取 else / 长度不足则填0 for(i = 0; i = len; +i) / 往后移动 idslen - i = idlen - i; for(i = 0; i slen - len; +i) / 填充字符0 idi = 0; return id; int StScore(char *s, int min, int max) char *q,*p = s; int i,num = 0; for(i = 0; pi; +i) / 删除非数字字符 if(pi 9) q = p + i; whil

23、e(*q = *(q + 1) +q; -i; for(i = 0; pi; +i) num = 10 * num + pi - 0; if(num max) return -1; return num;LinkList CreateList(int n) / 创建单向非循环链表 LinkList head; char s20; Node p,q; head = p = (LinkList)malloc(sizeof(node); for(int i = 0;i n;i+) q = (LinkList)malloc(sizeof(node); printf(学生的学号 : ,i + 1); s

24、canf(%s,s); strcpy(q-id,StId(s,5); do printf(学生的成绩 : ,i + 1); scanf(%s,s); q-score = StScore(s,0,100); while(q-score = -1); p-next = q; p = q; p-next = NULL; return head;void PrintList(LinkList head) Node p = head-next; while(p) printf(%st%dn,p-id,p-score); p = p-next; printf(n);int main() LinkList

25、head = CreateList(1); PrintList(head); return 0;1、建立一个非空的双向链表,链表的节点要有两个数据域:1).学生学号2).学生分数; 2、遍历双线链表,输出#include #include struct test/结构体 unsigned int number; int grade; struct test *next;/指向下一个 struct test *previous;/指向上一个;void output1(struct test *p)/正顺输出函数 while(p) printf(%ut%dn,p-number,p-grade); p=p-next; void output2(str

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1