《程序员面试宝典》读书笔记之单链表和源码
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; }Node; /*输出:头结点的指针*/ Node *Create() { Node *head; Node *p; Node *s; int x; int cycle = 1; // printf("sizeof(Node) = %d\n", sizeof(Node)); head = (Node *)malloc(sizeof(Node)); p = head; while(cycle) { scanf("%d", &x); if (0 != x) //输入数据是0作为结束标志 { s = (Node *)malloc(sizeof(Node)); s->data = x; p->next = s; p = s; } else { cycle = 0; } } //head = head->next; //面试宝典返回的是第一个结点的指针,觉得不合理 s->next = NULL; return head; } /*测表长*/ int SqListLength(Node *sql) { int length = 0; Node *tem = sql->next; while(tem != NULL) { ++length; tem = tem->next; } return length; } /*打印线性表*/ void PrintSqList(Node *sq) { Node *tem = sq->next; while(tem != NULL) { printf("sq->data = %d\n", tem->data); tem = tem->next; } } /*删除结点*/ Node *DeleteNode(Node *sq, int num) { Node *tem = sq->next; Node *fore = sq; while (tem != NULL && tem->data != num) //查找值为num的结点 { fore = tem; tem = tem->next; //printf("find it\n"); } if (tem->data == num) { fore->next = tem->next; //此句话是关键!!!! free(tem); printf("delete it\n"); } else { printf("Can't find that node!\n"); } return sq; } Node *InsertNode(Node *sq, int num) { Node *tem = sq->next; Node *fore = sq; Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = num; while (tem != NULL && tem->data < num) //顺序插入,找到合适的位置。 { fore = tem; tem = tem->next; printf("find it\n"); } fore->next = newNode; newNode->next = tem; /* if (tem != NULL) { fore->next = newNode; newNode->next = tem; } else { printf("insert failure\n"); }*/ return sq; } /* void BubbleSort(int arr[],int len) { int i; int j; for (i = 1; i < len; i++) { for (j = 0; j < len - i; j++) //排好顺序的元素在数组的后面 { if (arr[j] > arr[j + 1]) { int tem = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tem; } } } } void PrintArr(int arr[], int len) { printf("After sorting:\n"); for (int index = 0; index < len; index++) { printf("%d\n",arr[index]); } }*/ /*线性表排序*/ Node *SortSq(Node *sq) { Node *p; int length = SqListLength(sq); if (length == 0 || length == 1) { return sq; } else { for (int i = 1; i < length; i++) { p = sq->next; for (int j = 0; j < length - i; j++) { if (p->data > p->next->data) //不交换结点,只交换结点中的数据 { int tem = p->data; p->data = p->next->data; p->next->data = tem; } p = p->next; } } return sq; } } int main() { /* int arr[] = {1, 3, 2, 4}; BubbleSort(arr, 4); PrintArr(arr,4);*/ Node *sq = Create(); printf("len = %d\n", SqListLength(sq)); PrintSqList(sq); printf("\n"); sq = SortSq(sq); PrintSqList(sq); /* sq = DeleteNode(sq, 2); PrintSqList(sq); printf("\n"); sq = InsertNode(sq, 8); PrintSqList(sq); printf("\n");*/ return 0; }