单链表的操作有两种,一种是带头节点的链表,一种是不带头节点的链表:
首先我们看一下不带头节点的链表的基本操作:
/****************************************
本程序所写的链表均是不带头节点的链表操作
****************************************/
#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();
}