您的位置:首页 > 编程语言 > C语言/C++

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: