循环链表可以用来使计算机处理内存工作区或输出至数据缓冲区。
循环链表的插入和删除
#include " iostream " #include " stdlib.h " using namespace std; struct clist{ int data; struct clist * next;};typedef struct clist cnode;typedef cnode * clink; /* -----循环链表的输出------ */ void printclist( clink head){ clink ptr; head = head -> next; ptr = head; do { printf( " [%d] " ,ptr -> data); ptr = ptr -> next; } while (head != ptr && head != head -> next); printf( " \n " );} /* -----循环链表的结点插入---- */ clink insertnode(clink head,clink ptr, int value){ clink new_node; new_node = (clink) malloc( sizeof (cnode)); if ( ! new_node) return NULL; new_node -> data = value; new_node -> next = NULL; if (head == NULL) { new_node -> next = new_node; return new_node; } if (ptr == NULL) { /* ----情况1:插在第一结点之前--- */ new_node -> next = head -> next; head -> next -> next = new_node; } else { /* -----情况2:插在结点之后------- */ new_node -> next = ptr -> next; ptr -> next = new_node; } if (ptr == head) head = new_node; return head;} /* ---循环链表结点删除--- */ clink deletenode(clink head,clink ptr){ clink previous; if (head == NULL) { /* ----情况1:删除第一个结点---- */ head -> next = ptr -> next; } else { /* --情况2:删除中间结点--- */ previous = head; if (head != head -> next) while (previous -> next != ptr) previous = previous -> next; previous -> next = ptr -> next; } if (ptr == head) head = previous; free(ptr); return head;} /* 使用插入结点的方式来创建链表,完成后将链表内容输出,然后删除前后两结点 */ int main(){ clink head = NULL; int list[ 6 ] = { 9 , 7 , 3 , 4 , 5 , 6 }; int i; head = insertnode(head,head,list[ 0 ]); printf( " 创建第一个结点: " ); printclist(head); /* ---情况1:插在第一结点前---- */ head = insertnode(head,NULL,list[ 1 ]); printf( " 插入第一结点之前: " ); printclist(head); for (i = 2 ;i < 6 ;i ++ ) { /* ---情况2:插在结点之后----- */ head = insertnode(head,head -> next,list[i]); printf( " 插入结点之后: " ); printclist(head); } /* ---情况1:删除第一个结点--- */ head = deletenode(head,head -> next); printf( " 删除第一个结点: " ); printclist(head); /* --删除最后一个结点-- */ printf( " 删除最后一个结点: " ); head = deletenode(head,head); printclist(head);}