4gE北方站长站 1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。
4gE北方站长站 2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。
4gE北方站长站 二、双向链表 4gE北方站长站 双向链表其实是单链表的改进。
4gE北方站长站 当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。
4gE北方站长站 在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。在c语言中双向链表结点类型可以定义为:
4gE北方站长站typedef struct node4gE北方站长站 {4gE北方站长站 int data; /*数据域*/4gE北方站长站 struct node *llink,*rlink; /*链域,*llink是左链域指针,*rlink是右链域指针*/4gE北方站长站 }JD; |
4gE北方站长站 当然,也可以把一个双向链表构建成一个双向循环链表。
4gE北方站长站 双向链表与单向链表一样,也有三种基本运算:查找、插入和删除。
4gE北方站长站 双向链表的基本运算:
4gE北方站长站 1、查找
4gE北方站长站 假若我们要在一个带表头的双向循环链表中查找数据域为一特定值的某个结点时,我们同样从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。
4gE北方站长站 下例就是应用双向循环链表查找算法的一个
程序。
4gE北方站长站#include <stdio.h>4gE北方站长站 #include <malloc.h>4gE北方站长站 #define N 104gE北方站长站 typedef struct node4gE北方站长站 {4gE北方站长站 char name[20];4gE北方站长站 struct node *llink,*rlink;4gE北方站长站 }stud;4gE北方站长站 stud * creat(int n)4gE北方站长站 {4gE北方站长站 stud *p,*h,*s;4gE北方站长站 int i;4gE北方站长站 if((h=(stud *)malloc(sizeof(stud)))==NULL)4gE北方站长站 {4gE北方站长站 printf("不能分配内存空间!");4gE北方站长站 exit(0);4gE北方站长站 }4gE北方站长站 h->name[0]=’/0’;4gE北方站长站 h->llink=NULL;4gE北方站长站 h->rlink=NULL;4gE北方站长站 p=h;4gE北方站长站 for(i=0;i<n;i++)4gE北方站长站 {4gE北方站长站 if((s= (stud *) malloc(sizeof(stud)))==NULL)4gE北方站长站 {4gE北方站长站 printf("不能分配内存空间!");4gE北方站长站 exit(0);4gE北方站长站 }4gE北方站长站 p->rlink=s;4gE北方站长站 printf("请输入第%d个人的姓名",i+1);4gE北方站长站 scanf("%s",s->name);4gE北方站长站 s->llink=p;4gE北方站长站 s->rlink=NULL;4gE北方站长站 p=s;4gE北方站长站 }4gE北方站长站 h->llink=s;4gE北方站长站 p->rlink=h;4gE北方站长站 return(h);4gE北方站长站 }4gE北方站长站 stud * search(stud *h,char *x)4gE北方站长站 {4gE北方站长站 stud *p;4gE北方站长站 char *y;4gE北方站长站 p=h->rlink;4gE北方站长站 while(p!=h)4gE北方站长站 {4gE北方站长站 y=p->name;4gE北方站长站 if(strcmp(y,x)==0)4gE北方站长站 return(p);4gE北方站长站 else p=p->rlink;4gE北方站长站 }4gE北方站长站 printf("没有查找到该数据!");4gE北方站长站 }4gE北方站长站 void print(stud *h)4gE北方站长站 {4gE北方站长站 int n;4gE北方站长站 stud *p;4gE北方站长站 p=h->rlink;4gE北方站长站 printf("数据信息为:/n");4gE北方站长站 while(p!=h)4gE北方站长站 {4gE北方站长站 printf("%s ",&*(p->name));4gE北方站长站 p=p->rlink;4gE北方站长站 }4gE北方站长站 printf("/n");4gE北方站长站 }4gE北方站长站 main()4gE北方站长站 {4gE北方站长站 int number;4gE北方站长站 char studname[20];4gE北方站长站 stud *head,*searchpoint;4gE北方站长站 number=N;4gE北方站长站 clrscr();4gE北方站长站 head=creat(number);4gE北方站长站 print(head);4gE北方站长站 printf("请输入你要查找的人的姓名:");4gE北方站长站 scanf("%s",studname);4gE北方站长站 searchpoint=search(head,studname);4gE北方站长站 printf("你所要查找的人的姓名是:%s",*&searchpoint->name);4gE北方站长站 } |
4gE北方站长站
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面