C语言中,链表的创建,插入,删除,遍历,求链表长度,排序等
2014-09-15 16:12
507 查看
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//定义结点
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;
//函数声明
PNODE create_list(); //创建链表
void traverse_list(PNODE pHead); //遍历链表
int is_empty(PNODE pHead); //判断链表是否为空
int length_list(PNODE pHead); //求链表的长度
int delete_node(PNODE pHead,int index); //删除结点,0从头结点开始,返回值为删除的结点的值
void insert_node(PNODE pHead, int index, int insertVal); //插入,当碰到index时,给当前结点的后面插入一个新的结点
void sort_list(PNODE pHead);//排序
int main()
{
PNODE pHead = NULL;
int result;
pHead = create_list();
printf("链表的值:");
traverse_list(pHead);
result = is_empty(pHead);
printf("链表是否为空:%d\n",result);
printf("链表的长度为:%d\n",length_list(pHead));
sort_list(pHead);
printf("排序后的链表为:");
traverse_list(pHead);
//printf("删除的结点的值为:%d\n",delete_node(pHead,2));
printf("正在插入结点,请稍后...\n");
insert_node(pHead,2,20);
printf("插入结点后的链表为:");
traverse_list(pHead);
return 0;
}
//创建链表
PNODE create_list()
{
int len;
//结点的个数
int val;
//临时存放结点的data
int i;
printf("请输入你要生成的链表的结点的个数:len=");
scanf_s("%d",&len,2);
//创建头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("创建头结点失败!\n");
exit(-1);
}
//创建一个临时结点(这个临时结点始终指向尾结点)
PNODE pTail = pHead;
pTail->pNext = NULL;
for (i = 0; i < len; i++)
{
printf("请输入第%d个结点的值:val=",i+1);
scanf_s("%d",&val,2);
/*
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。
所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
*/
//创建新结点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("创建新结点失败!\n");
exit(-1);
}
pNew->data = val;
//指定新结点的数据域
//定义一个临时指针移动指向每个新结点
pTail->pNext = pNew;
pNew->pNext = NULL; //指定新结点的指针域
pTail = pNew;
}
printf("链表创建成功!\n");
return pHead;
}
//遍历结点
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (p != NULL)
{
printf("%d\t",p->data);
p = p->pNext;
}
printf("\n");
}
//判断链表是否为空
int is_empty(PNODE pHead)
{
if (pHead->pNext == NULL)
{
return 0; //链表为空
}
return 1;
}
//求链表的长度
int length_list(PNODE pHead)
{
int length=0;
PNODE p = pHead->pNext;
while (p != NULL)
{
length++;
p = p->pNext;
}
return length;
}
//排序
void sort_list(PNODE pHead)
{
int i, j, temp;
int len = length_list(pHead);
PNODE p, q;
//插入排序
for (i = 0,p = pHead->pNext; i < len-1;i++,p = p->pNext)
{
for (j = i + 1,q = p->pNext; j < len;j++,q = q->pNext)
{
if (p->data > q->data)
//相当于a[i]>a[j]
{
temp = p->data;
//temp = a[i];
p->data = q->data;
//a[i] = a[j];
q->data = temp;
// a[j] = temp;
}
}
}
return;
}
//删除结点
int delete_node(PNODE pHead, int index)
{
PNODE p = pHead->pNext,temp=NULL;
int i = 0;
int length = length_list(pHead);
if (index >= length - 1)
{
printf("删除失败!\n");
return -1;
}
while (p != NULL)
{
i++;
//printf("i=%d\t",i);
if (index == i)
{
//printf("正在准备删除结点\n");
//删除结点
temp = p->pNext;
p = p->pNext->pNext;
return temp->data;
}
p = p->pNext;
}
return NULL;
}
//插入结点
void insert_node(PNODE pHead, int index, int insertVal)
{
PNODE p = pHead->pNext;
PNODE newNode = (PNODE *)malloc(sizeof(NODE));
int i = 0;
int length = length_list(pHead);
if (index >= length - 1)
{
printf("插入结点失败!\n");
return -1;
}
if (newNode == NULL)
{
printf("创建新结点失败!\n");
return;
}
newNode->data = insertVal;
newNode->pNext = NULL;
//printf("构建新结点成功!\n");
while (p != NULL)
{
i++;
if (index == i)
{
//在p结点的后面插入新的结点
newNode->pNext = p->pNext;
p->pNext = newNode;
}
p = p->pNext;
}
}
#include <malloc.h>
#include <stdlib.h>
//定义结点
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;
//函数声明
PNODE create_list(); //创建链表
void traverse_list(PNODE pHead); //遍历链表
int is_empty(PNODE pHead); //判断链表是否为空
int length_list(PNODE pHead); //求链表的长度
int delete_node(PNODE pHead,int index); //删除结点,0从头结点开始,返回值为删除的结点的值
void insert_node(PNODE pHead, int index, int insertVal); //插入,当碰到index时,给当前结点的后面插入一个新的结点
void sort_list(PNODE pHead);//排序
int main()
{
PNODE pHead = NULL;
int result;
pHead = create_list();
printf("链表的值:");
traverse_list(pHead);
result = is_empty(pHead);
printf("链表是否为空:%d\n",result);
printf("链表的长度为:%d\n",length_list(pHead));
sort_list(pHead);
printf("排序后的链表为:");
traverse_list(pHead);
//printf("删除的结点的值为:%d\n",delete_node(pHead,2));
printf("正在插入结点,请稍后...\n");
insert_node(pHead,2,20);
printf("插入结点后的链表为:");
traverse_list(pHead);
return 0;
}
//创建链表
PNODE create_list()
{
int len;
//结点的个数
int val;
//临时存放结点的data
int i;
printf("请输入你要生成的链表的结点的个数:len=");
scanf_s("%d",&len,2);
//创建头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("创建头结点失败!\n");
exit(-1);
}
//创建一个临时结点(这个临时结点始终指向尾结点)
PNODE pTail = pHead;
pTail->pNext = NULL;
for (i = 0; i < len; i++)
{
printf("请输入第%d个结点的值:val=",i+1);
scanf_s("%d",&val,2);
/*
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。
所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
*/
//创建新结点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("创建新结点失败!\n");
exit(-1);
}
pNew->data = val;
//指定新结点的数据域
//定义一个临时指针移动指向每个新结点
pTail->pNext = pNew;
pNew->pNext = NULL; //指定新结点的指针域
pTail = pNew;
}
printf("链表创建成功!\n");
return pHead;
}
//遍历结点
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (p != NULL)
{
printf("%d\t",p->data);
p = p->pNext;
}
printf("\n");
}
//判断链表是否为空
int is_empty(PNODE pHead)
{
if (pHead->pNext == NULL)
{
return 0; //链表为空
}
return 1;
}
//求链表的长度
int length_list(PNODE pHead)
{
int length=0;
PNODE p = pHead->pNext;
while (p != NULL)
{
length++;
p = p->pNext;
}
return length;
}
//排序
void sort_list(PNODE pHead)
{
int i, j, temp;
int len = length_list(pHead);
PNODE p, q;
//插入排序
for (i = 0,p = pHead->pNext; i < len-1;i++,p = p->pNext)
{
for (j = i + 1,q = p->pNext; j < len;j++,q = q->pNext)
{
if (p->data > q->data)
//相当于a[i]>a[j]
{
temp = p->data;
//temp = a[i];
p->data = q->data;
//a[i] = a[j];
q->data = temp;
// a[j] = temp;
}
}
}
return;
}
//删除结点
int delete_node(PNODE pHead, int index)
{
PNODE p = pHead->pNext,temp=NULL;
int i = 0;
int length = length_list(pHead);
if (index >= length - 1)
{
printf("删除失败!\n");
return -1;
}
while (p != NULL)
{
i++;
//printf("i=%d\t",i);
if (index == i)
{
//printf("正在准备删除结点\n");
//删除结点
temp = p->pNext;
p = p->pNext->pNext;
return temp->data;
}
p = p->pNext;
}
return NULL;
}
//插入结点
void insert_node(PNODE pHead, int index, int insertVal)
{
PNODE p = pHead->pNext;
PNODE newNode = (PNODE *)malloc(sizeof(NODE));
int i = 0;
int length = length_list(pHead);
if (index >= length - 1)
{
printf("插入结点失败!\n");
return -1;
}
if (newNode == NULL)
{
printf("创建新结点失败!\n");
return;
}
newNode->data = insertVal;
newNode->pNext = NULL;
//printf("构建新结点成功!\n");
while (p != NULL)
{
i++;
if (index == i)
{
//在p结点的后面插入新的结点
newNode->pNext = p->pNext;
p->pNext = newNode;
}
p = p->pNext;
}
}
相关文章推荐
- 创建链表,遍历,求长度,插入,删除,排序,是否为空
- 链表的初始化、遍历、删除、插入、判断是否为空、求长度 C语言实现
- 数据结构链表创建,遍历,是否为空,求长度,插入,删除算法的演示
- C语言 ---单链表创建、求长度、删除、排序等操作
- C语言 单向链表的创建、遍历、排序、删除操作
- c语言链表的创建、插入、删除、排序
- 数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)
- 单链表创建、测长度、打印、删除节点、插入节点、排序、逆置
- 链表的创建 查找 排序 插入 删除 逆序 长度 显示
- 双向链表 C语言 (创建,插入,删除,判空,返回链表长度)
- (C语言)链表的创建、遍历、插入和删除
- c语言单向列表的创建、插入、删除、排序和遍历。。。
- C语言单链表的创建、插入、查找、删除、求长、排序、遍历
- 链表,创建,删除,插入,反转,排序
- 判断链表是否为空、求链表长度、插入新节点、删除节点、链表排序
- 单链表的基本操作:建立,求长度,输出,排序,插入,删除,逆置
- C语言链表操作模板(添加,删除,遍历,排序)
- 单链表创建-遍历-排序-插入-删除-逆序操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 03链表的创建、插入、删除、遍历、排序