1、算法与数据结构程序实例算法与数据结构0_双向循环链表/*#*/*main.c */*= 工程名称: Link 组成文件: main.c link.c link.h 功能描述: 链表综合练习 程序分析: 完成链表建立,结点删除,结点插入等操作 维护记录: 2010-09-12 v1.1 add by dxh=*/#include #include #include link.hvoid display(void) printf(/*/n); printf(/* 1: 创建链表 */n); printf(/* 2: 插入链表 */n); printf(/* 3: 删除链表 */n); printf
2、(/* 4: 搜索链表 */n); printf(/* 5: 输出链表 */n); printf(/* 0: 退出链表 */n); printf(/*/n);int main(void) TYPE *head = NULL,*Lsearch = NULL,*ins = NULL; int delnum = 0,searnum = 0; int menu = 0,link_num = 0; while(1) display(); scanf(%d,&menu); switch(menu) case CREATE_CMD : printf(input create link Number:n);
3、scanf(%d,&link_num); head = creat(link_num); print(head); /打印创建的链表 break; case INSERT_CMD : ins = (TYPE *)malloc(sizeof(TYPE); printf(insert Number and Age:n); scanf(%d%d,&ins-num,&ins-age); head = insert(head,ins); print(head); /打印插入节点后的链表 break; case DELETE_CMD : printf(input delete Number:n); sca
4、nf(%d,&delnum); head = delete(head,delnum); print(head); /打印删除一个节点后的链表 break; case SEARCH_CMD : printf(input search Number:n); scanf(%d,&searnum); Lsearch = search(head,searnum); print(Lsearch); /从搜索到的节点开始打印 break; case PRINT_CMD : print(head); /从搜索到的节点开始打印 break; case EXIT_CMD : return 0; break; de
5、fault: printf(请按提示菜单,输入有效数据进行操作!n); break; /*link.h */#ifndef _linker_h_#define _linker_h_#include #define EXIT_CMD 0#define CREATE_CMD 1#define INSERT_CMD 2#define DELETE_CMD 3#define SEARCH_CMD 4#define PRINT_CMD 5typedef struct node int num; int age; struct node *prior; struct node *next;TYPE;ext
6、ern TYPE * creat(int n);extern TYPE * delete(TYPE * head,int num);extern TYPE * insert(TYPE * head,TYPE * pi);extern TYPE * search(TYPE * head,int num);extern void print(TYPE * head);#endif/*Link.c*/#include #include #include link.h/=/ 语法格式: creat(int n)/ 实现功能: 创建一个具有n个节点的链表,并对其值进行初始化/ 参数: n: 链表的长度,
7、即节点的个数/ 返回值: 所创建链表的首地址/=TYPE * creat(int n) TYPE *head = NULL,*ins; int i; for(i=0;inum,&ins-age); head = insert(head,ins); return(head);/=/ 语法格式: delete(TYPE * head,int num)/ 实现功能: 删除给定序号所指向的节点/ 参数: *head:待删除链表/ num: 所需删除的节点/ 返回值: 删除指定节点后的新链表首址/=TYPE * delete(TYPE * head,int num) TYPE *pf,*pb = hea
8、d; if(head=NULL) printf(nempty list!n); goto end; while (pb-num!=num & pb-next!=head) pf=pb; pb=pb-next; if(pb-num=num) if(pb=head) if (pb-next = head & pb-prior = head) /如果只有一个节点 free(pb); head = NULL; goto end; pb-next-prior = head-prior; /头节点指向尾 head-prior-next = pb-next; /尾节点指向头 head=pb-next; /得
9、到新头节点地址 else pf-next = pb-next; pb-next-prior = pf; free(pb); printf(The node is deletedn); else printf(The node not been found!n);end: return head;/=/ 语法格式: insert(TYPE * head,TYPE * pi)/ 功能: 将新申请的节点加入到指定链表中,并按num从小到大排序/ 参数: *head:待插入链表/ * pi:带插入节点/ 返回值: 插入指定节点后的新链表首址/=TYPE * insert(TYPE * head,TYP
10、E * pi) TYPE *pb=head ,*pf; if(head=NULL) /如果为空就建立,空间在传入前申请好 head=pi; pi-prior=head; pi-next=head; else while(pi-num pb-num)&(pb-next!=head) pf=pb;/pf指向前,pb指向后 pb=pb-next; /节点后移 /找到一个比插入值大的节点,然后插在它的前面 if(pi-num num) /找到所要插入节点位置,插到pb的前面 if(head=pb) /在第一结点之前插入 pi-next = pb; pi-prior = head-prior; pb-p
11、rior = pi; head-prior-next = pi; /尾节点 head=pi; /保存头节点 else pf-next = pi; /在中间位置插入 pb-prior = pi; pi-next = pb; pi-prior = pf; else /只有pb-head为空才会成立 pb-next = pi;/在表末插入 pi-next = head; pi-prior = pb; head-prior = pi; /头始终指向新插入的节点 return head;/=/ 语法格式: search(TYPE * head,int num)/ 实现功能: 搜索给定序号所指向的节点/
12、参数: *head:待搜索链表/ num: 按所需进行节点搜索/ 返回值: 搜索到的节点首址/=TYPE * search(TYPE * head,int num) TYPE *pb=head; if(head = NULL) return head; while(pb-num != num)&(pb-next!=head) pb=pb-next; /节点后移 if (pb-num = num) return pb; else return head;/=/ 语法格式: print(TYPE * head)/ 功能: 打印指定链表中的全部节点数据,由于循环双向表没有头节点,/每个节点性质完全一
13、样,只要给出任意节点就可以遍历/ 参数: *head:待打印的链表首址/ 返回值: 无/=void print(TYPE * Lnode) TYPE * pb = Lnode; printf(n链表所有信息如下:n); printf(addressttNumberttAgen); if (pb = NULL) printf(n); return; while(pb-next != Lnode) printf(%xtt%dtt%dn,pb,pb-num,pb-age); /printf(addr: p = %xtn = %xnn,pb-prior,pb-next); pb=pb-next; pr
14、intf(%xtt%dtt%dn,pb,pb-num,pb-age); /printf(addr: p = %xtn = %xnn,pb-prior,pb-next); printf(n);/*#*/1_线性表/*#*/多维数组-/*MoreArray.c*/#include int main(void) int i,j,k; int str234 = 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16, 17,18,19,20, 21,22,23,24; int (*p1)34 = str; int *p2 = str; int *p3 = str; prin
15、tf(n标准多维指针访问:n); for (i=0;i24;i+) printf(%d ,*(*(*(p1)+i); printf(n一维指针访问:n); for (i=0;i24;i+) printf(%d ,*(p2+i); printf(n多维指针访问:n); for (i=0;i24;i+) printf(%d ,*(p3+i); /printf(%d ,*(*(*(p3)+i); /段错误 /printf(%d ,*(p3+i); /段错误 printf(n指针下标法访问:n); for (i=0;i2;i+) for (j=0;j3;j+) for (k=0;k/*= 工程名称:
16、Link 组成文件: main.c link.c link.h 功能描述: 链表综合练习 程序分析: 完成链表建立,结点删除,结点插入等操作 维护记录: 2010-09-12 v1.1 add by dxh=*/*main.c*/#include #include #include link.hvoid display(void) printf(/*/n); printf(/* 1: 创建链表 */n); printf(/* 2: 插入链表 */n); printf(/* 3: 删除链表 */n);/ printf(/* 4: 搜索链表 */n); printf(/* 5: 输出链表 */n)
17、; printf(/* 0: 退出链表 */n); printf(/*/n);int main(void) NODE *head = NULL; TYPE *ins = NULL; int delnum = 0,searnum = 0; int menu = 0,link_num = 0; while(1) display(); scanf(%d,&menu); switch(menu) case CREATE_CMD : printf(input create link Number:n); scanf(%d,&link_num); head = creat(link_num); print
18、(head); /打印创建的链表 break; case INSERT_CMD : ins = (TYPE *)malloc(sizeof(TYPE); printf(insert Number and Age:n); scanf(%d%d,&ins-num,&ins-age); head = insert(head,&ins-list); print(head); /打印插入节点后的链表 break; case DELETE_CMD : printf(input delete Number:n); scanf(%d,&delnum); head = delnode(head,delnum);
19、 print(head); /打印删除一个节点后的链表 break; case SEARCH_CMD : break; case PRINT_CMD : print(head); /从搜索到的节点开始打印 break; case EXIT_CMD : return 0; break; default: printf(请按提示菜单,输入有效数据进行操作!n); break; /*link.c*/#include #include #include link.h/=/ 语法格式: creat(int n)/ 实现功能: 创建一个具有n个节点的链表,并对其值进行初始化/ 参数: n: 链表的长度,即节点的个数/ 返回值: 所创建链表的首地址/=NODE * creat(int n) NODE *head = NULL; TYPE *ins = NULL; int i; for(i=0;inum,&ins-age); head = insert(head,&ins-list); return(head);/=/ 语法格式: insert(TYPE * head,TYPE * pi)/ 功能: 将新申请的节点加入到指定链表中,并按照num进行从小到大排序/ 参数: *head:待插入链表/ * pi:带插入节点/ 返回值: 插入指定节点后的新链表首址/=
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2