单链表的操作有两种,一种是带头节点的链表,一种是不带头节点的链表:
首先我们看一下不带头节点的链表的基本操作:
/**************************************** 本程序所写的链表均是不带头节点的链表操作 ****************************************/ #include "stdio.h" #include "stdlib.h" typedef struct _Node { int data; struct _Node* next; }Node; Node* InitNode(int val) { Node* NodeFirst = (Node *)malloc(sizeof(Node)); NodeFirst->data = val; NodeFirst->next = NULL; return NodeFirst; } int SqlistDisplay(Node* head) { Node* TmpNode = head; if (head == NULL) { return 1; } while (1) { printf("%d", TmpNode->data); if (TmpNode->next == NULL) { break; } else { TmpNode = TmpNode->next; printf("->"); } } printf(" "); return 0; } /************************** 头插法,对链表追加一个结点 ***************************/ Node* SqlistHeadInsert(Node* head, int val) { Node* NodeInsert = NULL; if (head == NULL) { return head; } NodeInsert = (Node*)malloc(sizeof(Node)); NodeInsert->data = val; NodeInsert->next = head; return NodeInsert; } /***************************** 头插法,对链表末尾追加一个结点 *****************************/ Node* SqlistTailInsert(Node* head, int val) { Node* NodeInsert = NULL; Node* TmpNode = head; if (head == NULL) { return head; } NodeInsert = (Node*)malloc(sizeof(Node)); NodeInsert->data = val; NodeInsert->next = NULL; while (TmpNode->next != NULL) { TmpNode = TmpNode->next; } TmpNode->next = NodeInsert; return head; } /***************************** 添加操作,在指定位置添加结点 *****************************/ Node* NodeInsert(Node* head, int location, int val) { Node* TmpNode = NULL; Node* InsertNode = NULL; if (head == NULL || location == 0) { InsertNode = (Node*)malloc(sizeof(Node)); InsertNode->data = val; InsertNode->next = head; return InsertNode; } else { TmpNode = head; while(--location) { TmpNode = TmpNode->next; if (TmpNode == NULL) { printf("index has over flow! "); return head; } } InsertNode = (Node*)malloc(sizeof(Node)); InsertNode->data = val; InsertNode->next = TmpNode->next; TmpNode->next = InsertNode; return head; } } /***************************** 删除操作,删除指定位置的结点 *****************************/ Node* NodeDelete(Node* head, int location) { Node* FinalNode = head; Node* TmpNode = head; Node* freeNode = NULL; if (head == NULL) { return head; } if (location == 0) { FinalNode = head->next; free(TmpNode); } else { while (--location) { TmpNode = TmpNode->next; if (TmpNode->next == NULL) { printf("index node does not exist! "); return NULL; } } freeNode = TmpNode->next; TmpNode->next = freeNode->next; free(freeNode); } return FinalNode; } /***************************** 链表的逆序操作,将链表的顺序逆转 *****************************/ Node* ListReserse(Node* head) { if (head == NULL || head->next == NULL) { return head; } Node* pre = NULL; Node* cur = NULL; Node* nex = NULL; pre = head; cur = pre->next; while (cur) { nex = cur->next; cur->next = pre; pre = cur; cur = nex; } head->next = NULL; head = pre; return head; } /***************************** 链表的合并操作 *****************************/ Node* ListMerge(Node* L1, Node* L2) { Node* L = NULL; Node* r = NULL; Node* p1 = L1; Node* p2 = L2; if (p1->data < p2->data) { L = p1; p1 = p1->next; } else { L = p2; p2 = p2->next; } r = L; while (p1&&p2) { if (p1->data < p2->data) { r->next = p1; r = p1; p1 = p1->next; } else { r->next = p2; r = p2; p2 = p2->next; } } if (p1) { r->next = p1; } else { r->next = p2; } return L; } int main() { Node* Sqlist = InitNode(1); Node* Sqlist1 = InitNode(999); Node* SqlistMerged = NULL; Sqlist = SqlistTailInsert(Sqlist, 2); Sqlist = SqlistTailInsert(Sqlist, 3); Sqlist = SqlistTailInsert(Sqlist, 4); Sqlist = SqlistTailInsert(Sqlist, 5); Sqlist1 = SqlistTailInsert(Sqlist1, 875); Sqlist1 = SqlistTailInsert(Sqlist1, 325); Sqlist1 = SqlistTailInsert(Sqlist1, 478); Sqlist1 = SqlistTailInsert(Sqlist1, 533); SqlistDisplay(Sqlist); Sqlist = ListReserse(Sqlist); SqlistDisplay(Sqlist); Sqlist = NodeInsert(Sqlist, 2, 123); SqlistDisplay(Sqlist); Sqlist = NodeDelete(Sqlist, 4); SqlistDisplay(Sqlist); SqlistMerged = ListMerge(Sqlist, Sqlist1); SqlistDisplay(SqlistMerged); getchar(); }