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