单链表的基本操作,在Dev-c++下编译成功
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct Node
{
int data;
struct Node* next;
}Node, *LinkList; //Node等价于Struct Node,LinkList等价于Node*
//创建链表
LinkList Creat_List()
{
LinkList pHead = (LinkList)malloc(sizeof(Node));//创建头节点
if(NULL == pHead)
{
printf("创建失败!\n");
exit(-1);
}
LinkList pTail = pHead;
pTail->next = NULL;
int len;
int val;
int i;
printf("输入需要生成的链表的个数:len = ");
scanf("%d", &len);
for(i = 0; i < len; i++)
{
printf("请输入第%d个节点的值:", i);
scanf("%d", &val);
LinkList pNew = (LinkList)malloc(sizeof(Node));//i为0时创建首节点 开始放第0个元素
if(NULL == pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
//遍历链表
void Traverse_List(LinkList pHead)
{
LinkList p = pHead->next;
while(NULL != p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//查看链表长度
int Length_List(LinkList pHead)
{
LinkList p = pHead->next;
int len = 0;
while(NULL != p)
{
len++;
p = p->next;
}
return len;
}
//链表插入数据操作,在链表的pos个节点(同时是第pos-1个)的前边插入元素
bool Insert_List(LinkList pHead, int pos, int val)
{
int i = 0;
LinkList p = pHead;
while(NULL != p && i < pos-1)
{
p = p->next;
i++;
}
if(i > pos-1 || NULL ==p)
return false;
LinkList pNew = (LinkList)malloc(sizeof(Node));
if(NULL == pNew)
{
printf("动态分配失败!\n");
exit(-1);
}
pNew->data = val;
pNew->next = p->next;
p->next = pNew;
return true;
}
//删除pos个节点
bool Delete_List(LinkList pHead, int pos)
{
int i = 0;
LinkList p = pHead;
while(NULL != p->next && i < pos-1)
{
p = p->next;
i++;
}
if(i > pos-1 || NULL == p->next)
return false;
LinkList q = p->next;
p->next = p->next->next;
free(q);
q = NULL;
}
//销毁整个链表
void Destroy_List(LinkList pHead)
{
LinkList p = pHead;
if(NULL == p)
return;
p = p->next;
while(p != NULL)
{
LinkList q = p;
p = p->next;
free(q);
}
free(pHead);
pHead = NULL;
return;
}
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
LinkList pHead = Creat_List();
Traverse_List(pHead);
Insert_List(pHead, 3, 5);
Traverse_List(pHead);
Delete_List(pHead, 4);
Traverse_List(pHead);
Destroy_List(pHead);
return 0;
}