ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
关于头结点,一般链表都会有头结点,他会有几个好处: 1. 开始起始点的位置放在头结点的指针域中,这样在头结点的数据域可以存放一些其他数据,比如链表长度等。 2. 并且链表的第一个位置上的操作和其他位置的操作是一样的,这样空表和非空表的操作是一样的。 //    链表数据的定义,每个节点存放一个字符 ~~~ typedef char datatype; typedef struct node { datatype data; struct node *next; }linknode; typedef linknode *linklist; ~~~ 建立链表 ~~~ //--------- 头插法建立单链表 linklist CreatList(void) { datatype ch; linklist head; linknode *p; head = NULL; while((ch = getchar()) != '\n') { p = (linknode *)malloc(sizeof(linknode)); if(p == NULL) { printf("error: no space to get.\n"); return NULL; } p->data = ch; p->next = head; head = p; } return head; } //--------- 尾插法建立单链表,但是链表不带头结点 linklist CreatLinst2(void) { datatype ch; linklist head; linknode *p, *r; head = NULL; r = NULL; while((ch = getchar()) != '\n') { p = (linknode *)malloc(sizeof(linknode)); p->data = ch; if(head == NULL) head = p; else r->next = p; r = p; } if(r != NULL) r->next = NULL; return head; } ~~~ //--------- 尾插法建立单链表,带头结点,头结点暂时没有存放什么东西,可以存放链表的长度信息等。 ~~~ linklist CreatList1(void) { datatype ch; linklist head; linknode *p, *r; head = (linknode *)malloc(sizeof(linknode)); if(head == NULL) { printf("error: no space to get.\n"); return NULL; } r = head; while((ch = getchar()) != '\n') { p = (linknode *)malloc(sizeof(linknode)); p->data = ch; r->next = p; r = p; } r->next = NULL; return head; } ~~~ 删除链表 ~~~ //--------------------------- 没有头节点的话,删除的i值不能小于1,为1时其实是删除了首节点的后面的那一个节点。 (首节点不是头结点哈) //删除节点的时候,这个函数不能删除的第一个节点,有头节点的话就不能删除头结点,没有的话就不能删除首节点。 void DeleteNode(linklist head, int i) { int j = 0; linknode *p = head, *t; while(p && j < i-1) { p = p->next; j++; } if(!p || j>i-1) exit(1); t = p->next; p->next = t->next; free(t); } ~~~ 插入链表 //-------------------第一个节点的序号是0,如果有头节点的话,头结点的序号就是0 ~~~ void InsetNode(linklist head, datatype x, int i) { int j = 0; linknode *p, *t; p = head; while(p && j < i-1) { p = p->next; j++; } if(!p || j >i-1) exit(1); t = (linknode *)malloc(sizeof(linknode)); t->data = x; t->next = p->next; p->next = t; } ~~~ 查找链表 ~~~ // -------------------------------按序号查找-------------------------------- linklist GetNode(linklist head, int i) { int j = 0; linknode *p = head; while(p->next && j<i) { p = p->next; j++; } if(i == j) return p; else return NULL; } ~~~ // -------------------------------按值查找--------------------------- ~~~ linklist locatenode(linklist head, datatype key) { linklist p = head; while(p && p->data!=key) { p = p->next; } return p; } ~~~ 显示链表 ~~~ //------------- 无头结点的显示链表 void ShowList(linklist head) { linklist p = head; while(p != NULL) { printf("%c", p->data); head = head->next; p = head; } printf("\n"); } ~~~ 释放链表 ~~~ void FreeList(linklist head) { linklist p = head; while(p != NULL) { head = head->next; free(p); p = head; } printf("\nfree list is ok.\n"); } ~~~