本人写的关于经典数据结构——单链表的第一稿实现了,求创建链表、链表长度、链表不升插入、不降插入、删除元素、逆置链表、打印链表等函数。当然有些函数的健壮性还是有问题的,比如无法像空链表插入、不能打印空链表、不能删除单一元素等问题,有待完善~…… /************************************************************************/ /* author : thomas E-mail: chenhua308@gmail.com */ /************************************************************************/ #include <stdio.h> #include <malloc.h> typedef struct tag { int data; struct tag *next; } node; node *creat(int i) { //int i; node *p; p = (node *)malloc(sizeof(node)); //scanf("%d /n", &i); p -> data = i; p -> next =NULL; //head = p; return p; } int length( node *head ) { int n = 0; node *p; p = head; while ( p != NULL ) { n++; p = p ->next; } return n; } void print( node *head ) { node *p; // int i = 0; int n = length(head); printf("/n these %d records are : /n", n); p = head; for (int i = 1; i <=n; i++) { printf("the %d record is: %d /n", i, p -> data ); if ( i != n) { p = p -> next; } } } node *insert( node *head, int num ) { node *p, *p1, *p2; p1 = head; p = (node *)malloc(sizeof(node)); p -> data =num; while ( p1 -> next != NULL && p1 -> data > p -> data ) { p2 = p1; p1 = p1 -> next; } if ( p1 -> next == NULL) { p1 -> next = p; p -> next = NULL; } else if ( p1 == head) { p -> next = head; head = p; } else { p2 -> next = p; p -> next = p1; } return head; } node *insertascend( node *head, int num) { node *p, *p1, *p2; p1 = head; p = (node *)malloc(sizeof(node)); p -> data =num; while ( p1 -> next != NULL && p1 -> data < p -> data ) { p2 = p1; p1 = p1 -> next; } if ( p1 == head ) { if ( p1 -> data >= p -> data ) { p -> next = p1; head = p; } else { p1 -> next = p; p -> next = NULL; } } else if ( p1 -> next == NULL ) { if ( p1 -> data >= p -> data ) { p -> next = p1; p2 -> next = p; } else { p1 -> next = p; p -> next = NULL; } } else { p -> next = p1; p2 -> next = p; } return head; } node *del( node *head, int num) { node *p1, *p2; p1 = head; while ( num != p1 -> data && p1 -> next != NULL ) { p2 = p1; p1 = p1 -> next; } if ( num == p1 -> data ) { if ( p1 == head ) { head = p1 -> next; free(p1); } /*else if ( p1 -> next == NULL) { p2 -> next = NULL; free(p1); }*/ else { p2 -> next = p1 -> next; free(p1); } } else { printf( "/n %d could not been found", num ); } return head; } node *reverse(node *head) { node *p1, *p2, *p3; if ( head == NULL || head -> next == NULL ) { return head; } p1 = head; p2 = head -> next; while ( p2 ) { p3 = p2 -> next; p2 -> next = p1; p1 = p2; p2 = p3; } head -> next = NULL; head = p1; return head; } void main(int argc, char *argv[]) { node *head; head = creat(4); print(head); head = insertascend(head, 2); print(head); head = insertascend(head, 5); print(head); head = insertascend(head, 1); print(head); //head = insert(head, 2); //print(head); head = del(head, 4); print(head); //head = insert(head, 1); //head = insert(head, 5); //head = insert(head, 3); //print(head); head = reverse(head); print(head); //reverse(head); //print(head); }