C语言写的简单的单向链表
2016-04-30 14:08
661 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int T;
typedef struct Node
{
T data;
struct Node *next;
}Node;
//头结点创建
Node* CreateHead()
{
Node *p=(Node *)malloc(sizeof(Node));
if(p==NULL)
{
return NULL;
}
//初始化
memset(p,0,sizeof(Node));
return p;
}
//链表的遍历
int NodeList(Node *phead)
{
if(phead==NULL)
{
return -1;
}
Node *pCur=phead->next;
printf("head->");
while(pCur)
{
printf("%d->",pCur->data);
pCur=pCur->next;
}
puts("NULL");
return 0;
}
//头插法
int insertHead(Node *head,T data)
{
if(head==NULL)
{
return -1;
}
Node* pNew=(Node *)malloc(sizeof(Node));
if(pNew==NULL)
{
return -2;
}
pNew->data=data;
pNew->next=head->next;
head->next=pNew;
return 0;
}
//删除一个
int deleteNode(Node *head,T data)
{
if(NULL==head)
{
return -1;
}
Node *pCur=head;//指向上一个节点
Node *pNew=pCur->next;//指向下一个节点
while(pNew)
{
if(pNew->data==data)
{
pCur->next=pNew->next;
free(pNew);
break;
}
pCur=pNew;
pNew=pNew->next;
}
return 0;
}
//查找
Node* findNode(Node *head,T data)
{
if(head==NULL)
{
return NULL;
}
Node* pNew=head->next;
while(pNew)
{
if(pNew->data==data)
{
return pNew;
break;
}
pNew=pNew->next;
}
return NULL;
}
//节点释放
int freeNode(Node *phead)
{
Node *pNew=phead;
Node *pTmp;
if(pNew==NULL)
{
return -1;
}
while(pNew)
{
pTmp=pNew->next;
free(pNew);
pNew=pTmp;
}
return 0;
}
//翻转
int reverseNode(Node *p)
{
if(p==NULL)
{
return -1;
}
Node *pCur=p->next;//保存第一个待插入节点
p->next=NULL; //空节点
Node *tmp;
while(pCur)
{
tmp=pCur->next;
pCur->next=p->next;
p->next=pCur;
pCur=tmp;
}
return 0;
}
//节点排序
int sort(Node *p)
{
if(p==NULL||p->next==NULL)
{
return -1;
}
Node *pCur;
Node *pNew;
Node tmp;
for(pCur=p->next;pCur!=NULL;pCur=pCur->next)
{
for(pNew=pCur->next;pNew!=NULL;pNew=pNew->next)
{
if(pCur->data>pNew->data)
{
tmp=*pCur;
*pCur=*pNew;
*pNew=tmp;
tmp.next=pCur->next;
pCur->next=pNew->next;
pNew->next=tmp.next;
}
}
}
return 0;
}
int main()
{
Node *p=CreateHead();
int arr[]={21,234,213,21,324,213,342,12,34};
int len=sizeof(arr)/sizeof(int);
int i;
for(i=0;i<len;i++)
insertHead(p,arr[i]);
puts("初始化前");
NodeList(p);
puts("删除后");
deleteNode(p,1);
NodeList(p);
puts("查找");
Node* tmp=findNode(p,2);
if(tmp)
{
printf("找到%d\n",tmp->data);
}
else
{
printf("没找到\n");
}
puts("翻转");
reverseNode(p);
NodeList(p);
puts("排序");
sort(p);
NodeList(p);
freeNode(p);
p=NULL;
return 0;
}
#include <stdlib.h>
#include <string.h>
typedef int T;
typedef struct Node
{
T data;
struct Node *next;
}Node;
//头结点创建
Node* CreateHead()
{
Node *p=(Node *)malloc(sizeof(Node));
if(p==NULL)
{
return NULL;
}
//初始化
memset(p,0,sizeof(Node));
return p;
}
//链表的遍历
int NodeList(Node *phead)
{
if(phead==NULL)
{
return -1;
}
Node *pCur=phead->next;
printf("head->");
while(pCur)
{
printf("%d->",pCur->data);
pCur=pCur->next;
}
puts("NULL");
return 0;
}
//头插法
int insertHead(Node *head,T data)
{
if(head==NULL)
{
return -1;
}
Node* pNew=(Node *)malloc(sizeof(Node));
if(pNew==NULL)
{
return -2;
}
pNew->data=data;
pNew->next=head->next;
head->next=pNew;
return 0;
}
//删除一个
int deleteNode(Node *head,T data)
{
if(NULL==head)
{
return -1;
}
Node *pCur=head;//指向上一个节点
Node *pNew=pCur->next;//指向下一个节点
while(pNew)
{
if(pNew->data==data)
{
pCur->next=pNew->next;
free(pNew);
break;
}
pCur=pNew;
pNew=pNew->next;
}
return 0;
}
//查找
Node* findNode(Node *head,T data)
{
if(head==NULL)
{
return NULL;
}
Node* pNew=head->next;
while(pNew)
{
if(pNew->data==data)
{
return pNew;
break;
}
pNew=pNew->next;
}
return NULL;
}
//节点释放
int freeNode(Node *phead)
{
Node *pNew=phead;
Node *pTmp;
if(pNew==NULL)
{
return -1;
}
while(pNew)
{
pTmp=pNew->next;
free(pNew);
pNew=pTmp;
}
return 0;
}
//翻转
int reverseNode(Node *p)
{
if(p==NULL)
{
return -1;
}
Node *pCur=p->next;//保存第一个待插入节点
p->next=NULL; //空节点
Node *tmp;
while(pCur)
{
tmp=pCur->next;
pCur->next=p->next;
p->next=pCur;
pCur=tmp;
}
return 0;
}
//节点排序
int sort(Node *p)
{
if(p==NULL||p->next==NULL)
{
return -1;
}
Node *pCur;
Node *pNew;
Node tmp;
for(pCur=p->next;pCur!=NULL;pCur=pCur->next)
{
for(pNew=pCur->next;pNew!=NULL;pNew=pNew->next)
{
if(pCur->data>pNew->data)
{
tmp=*pCur;
*pCur=*pNew;
*pNew=tmp;
tmp.next=pCur->next;
pCur->next=pNew->next;
pNew->next=tmp.next;
}
}
}
return 0;
}
int main()
{
Node *p=CreateHead();
int arr[]={21,234,213,21,324,213,342,12,34};
int len=sizeof(arr)/sizeof(int);
int i;
for(i=0;i<len;i++)
insertHead(p,arr[i]);
puts("初始化前");
NodeList(p);
puts("删除后");
deleteNode(p,1);
NodeList(p);
puts("查找");
Node* tmp=findNode(p,2);
if(tmp)
{
printf("找到%d\n",tmp->data);
}
else
{
printf("没找到\n");
}
puts("翻转");
reverseNode(p);
NodeList(p);
puts("排序");
sort(p);
NodeList(p);
freeNode(p);
p=NULL;
return 0;
}
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)
- C语言实现输出链表中倒数第k个节点