带尾节点的循环链表基本操作

来源:互联网 发布:lol好玩的英雄 知乎 编辑:程序博客网 时间:2024/04/28 22:32
#include <stdio.h>#include <stdlib.h>typedef struct node{int data;struct node *next;}node,*link;void ListIni(link *list){*list = (link)malloc(sizeof(node));if(!(*list)){exit(-1);}(*list)->data = -9;(*list)->next = *list;}int ListLength(link list){int i = 0;link p = list->next;while(p != list){i++;p = p->next;}return i;}void ListDestroy(link *list){//*list原指向尾节点*list = (*list)->next;//头结点link p = (*list)->next;//第一个节点link q;while(p->next != *list){q = p->next;free(p);p = q;}free(*list);*list = NULL;}int ListInsert(link *list, int i, int e){int j = 0;//*list = (*list)->next;//*list尾结点,(*list)->next头节点link p = (*list)->next;//第一个节点;if(i < 0 || i > ListLength(*list) + 1){return -1;}while(j < i){p = p->next;j++;}link tmp = (link)malloc(sizeof(node));tmp->data = e;tmp->next = p->next;p->next = tmp;if(p == *list){*list = p;}return 0;}int ListDelete(link *list, int i, int *e){//link p = (*list)->next;//第一个节点;link p = *list;int j = 0;if(i <= 0 || i > ListLength(*list)){return -1;}link q;while(j < i-1){p = p->next;j++;}q = p->next;p->next = q->next;*e = q->data;if(q == *list){*list = p;}free(q);return 0;}void ListPrint(link list){if(list != NULL){link p = list->next;while(p != list){printf("%d\n",p->data);p = p->next;}}else{printf("list does not exist.\n");}}void ListTraverse(link list, int(*vi)(int a)){link p = list->next;while(p != list){vi(p->data);p = p->next;}printf("\n");}int GetElem(link list, int i, int *e){int j = 1;link p = list->next->next;if(i <= 0 || i > ListLength(list) + 1){return -1;}while(j < i){j++;p = p->next;}*e = p->data;return 0;}int LocateElem(link list, int e, int(*compare)(int a, int b)){link p = list->next->next;int i;while(p != list->next){i++;if(compare(e,p->data)){return i;}p = p->next;}return -1;}int PriorElem(link list, int cur, int *pre){link p = list->next->next;//第一个节点link q = p->next;while(q != list->next){if(q->data == cur){*pre = p->data;return 0;}p = q;q = q->next;}return -1;}int NextElem(link list, int cur, int *next){link p = list->next->next;while(p != list){if(p->data == cur){*next = p->next->data;return 0;}p = p->next;}return -1;}int main(){link head;ListIni(&head);ListInsert(&head,1,1);ListInsert(&head,1,2);ListInsert(&head,3,3);ListPrint(head);int e = 0;ListDelete(&head,1,&e);printf("\n");ListPrint(head);return 0;}


原创粉丝点击