不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作

来源:互联网 发布:淘宝图能放阿里上吗? 编辑:程序博客网 时间:2024/04/25 23:57
//不带头结点的单链表#include<stdio.h>#include<malloc.h>//链表结构体typedef struct _Node{int val;struct _Node* next;}Node,*LinkList;void InitList(LinkList* list){*list = NULL;}void InsertHeadList(LinkList* list){int data;scanf("%d", &data);while (data != 0){Node* node = (Node*)malloc(sizeof(Node));node->val = data;if (*list == NULL){*list = node;(*list)->next = NULL;}else{node->next = *list;*list = node;}scanf("%d", &data);}}void Print(LinkList list){Node* s = list;while (s != NULL){printf("%d ", s->val);s = s->next;}printf("\n");}void InsertTailList(LinkList* list){int data;scanf("%d", &data);while (data != 0){Node* node = (Node*)malloc(sizeof(Node));node->val = data;node->next = NULL;if (*list == NULL){*list = node;}else{Node* s = *list;while (s->next != NULL){s = s->next;}s->next = node;}scanf("%d", &data);}}void DeleteHeadList(LinkList* list){if (*list == NULL){return;}Node* s = *list;*list = (*list)->next;free(s);}void DeleteTailList(LinkList* list){if (*list == NULL){return;}Node* s = *list;if (s->next == NULL){DeleteHeadList(list);}while (s->next->next != NULL){s = s->next;}Node* r = s->next;s->next = s->next->next;free(r);}int Count(LinkList list){Node* s = list;int count = 0;while (s != NULL){s = s->next;count++;}return count;}bool IsEmpty(LinkList list){if (list != NULL){return false;}return true;}void Clear(LinkList* list){while (*list != NULL){DeleteHeadList(list);}}void Reverse(LinkList* list){if (*list == NULL || (*list)->next == NULL){return;}//三节点法Node* first;Node* second;Node* last;first = *list;second = (*list)->next;last = second->next;first->next = NULL;//如果有三个节点以上开始转置while (last != NULL){//连接second->next = first;//后移first = second;second = last;last = last->next;}second->next = first;*list = second;}int main(void){LinkList list;//初始化InitList(&list);//插入//头插//InsertHeadList(&list);//尾插InsertTailList(&list);//统计节点个数int ncount = Count(list);printf("ncount=%d\n", ncount);//单链表原地转置Reverse(&list);//打印Print(list);//删除//头删DeleteHeadList(&list);//尾删DeleteTailList(&list);Print(list);//判断是否为空bool temp = IsEmpty(list);if (temp){printf("空\n");}else{printf("不是空\n");}//清空Clear(&list);temp = IsEmpty(list);if (temp){printf("空\n");}else{printf("不是空\n");}return 0;}

阅读全文
0 0
原创粉丝点击