单链表逆向 #include <stdio.h> #include <stdlib.h> struct node { int data; struct node * next; }; //带头结点的单链表 struct node * create_list() { struct node * head = NULL; head = (struct node *)malloc(sizeof(struct node)); if (head == NULL) { printf("malloc error!/n"); return NULL; } head->data = 0; head->next = NULL; return head; } //在头结点之后插入新结点 int insert_node(struct node * head, int num) { //分配新结点 struct node * new_node = NULL; new_node = (struct node * )malloc(sizeof(struct node)); if (new_node == NULL) { printf("malloc error!/n"); return -1; } new_node->data = num; //在头结点之后插入新结点 new_node->next = head->next; head->next = new_node; return 0; } //显示所有结点 void show_list(struct node * head) { struct node * head_t = head->next; while(head_t != NULL) { printf("%d/n",head_t->data); head_t = head_t->next; } } //链表中的结点数 int count_list(struct node * head) { struct node * head_t = head->next; int i = 0; //此处局部变量如果没有初始化竟然也会出问题 while(head_t != NULL) { i++; head_t = head_t->next; } return i; } //链表逆向 struct node * revert_list(struct node * head) { struct node * prev = head; struct node * pmid = head->next; struct node * pnext = head->next; //空链表或只有一个结点不用逆向 if ( (head->next== NULL) || count_list(head)==1 ) { return head; } //进行链表的逆向 while(pnext->next != NULL) { pnext = pnext->next; pmid->next = prev; prev = pmid; pmid = pnext; } //处理链表头和链表尾 head->next->next = NULL; head->next = pnext; pnext->next = prev; return 0; } //删除操作 int delete_node(struct node * head, int num) { struct node * temp = head->next; struct node * prev = head; //寻找删除的结点 while (temp) { if (num == temp->data) break; prev = temp; temp = temp->next; } //没有找到 if(temp == NULL) { printf("cann't find !/n"); return -1; } //删除结点 prev->next = temp->next; free(temp); return 0; } int main(int argc, char* argv[]) { struct node * head = NULL; head = create_list(); insert_node(head, 1); insert_node(head, 2); insert_node(head, 3); insert_node(head, 4); insert_node(head, 5); insert_node(head, 6); show_list(head); printf("revert_list/n"); revert_list(head); show_list(head); printf("after delete/n"); delete_node(head,3); show_list(head); }