C语言数据结构_链表的实现

来源:互联网 发布:c语言输入10个数排序 编辑:程序博客网 时间:2024/04/25 18:04

#include "stdio.h"
#include <malloc.h>
#include "stdlib.h"


typedef struct Node{
int data;
struct Node *pNext;
}NODE,*PNODE;  //NODE 等价于struct Node
//PNODE 等价于struct Node *;
void sort(PNODE pHead);
PNODE createList();
void traverseList(PNODE pNode);
int getLength(PNODE pHead);
bool insert(PNODE pHead,int pos,int val);
bool deleteElement(PNODE pHead,int pos,int *val);


int main(void){
PNODE pHead = NULL;
int len;
int temp;


pHead = createList();


traverseList(pHead);


len = getLength(pHead);
printf("链表的长度是:%d\n",len);


sort(pHead);
traverseList(pHead);


printf("请输入要插入的元素:\n");
scanf("%d",&temp);
insert(pHead,4,temp);
printf("插入元素后的输出:\n");
traverseList(pHead);


if (deleteElement(pHead,4,&temp))
{
printf(" 删除元素成功!它的值为:%d\n",temp);
}else{
printf(" 删除元素失败!");
}
return 0;
}


//创建链表
PNODE createList(){
int len;
int i ;
int val;

PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead){
printf("内存分配失败!!");
exit(-1);
}

PNODE pTail = pHead;
pTail->pNext = NULL;

printf("len=");
scanf("%d",&len);

for(i=0;i<len;++i){
printf("请输入第%d个节点的值",i+1);
scanf("%d",&val);

PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew){
printf("动态内存分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}


//遍历链表
void traverseList(PNODE pHead){
PNODE q;
q = pHead->pNext;


while (q!=NULL)
{
printf("%d  ",q->data);
q = q->pNext;
}
printf("\n");
}


//获得链表的长度
int getLength(PNODE pHead){
int i =0;
while(pHead->pNext != NULL){
pHead=pHead->pNext;
++i;
}
return i;
}


//链表的排序
void sort(PNODE pHead){
int i ,j ,t;
PNODE p,q;

int len;
len = getLength(pHead);
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)
{
t = p->data;
p->data=q->data;
q->data = t;
}
}
}
}




/************************************************************************/
/* 插入元素
/*1. 获得插入位置的指针                                                                      
/*2. 判断插入的位置是否合法
/*3. 完成元素的插入
/************************************************************************/

bool insert(PNODE pHead,int pos,int val){
int i = 0 ;
PNODE p = pHead;


while (NULL != p && i<pos-1)
{
p = p->pNext;
++i;
}

if (i>pos-1 || NULL == p)
return false;


PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}


/************************************************************************/
/* 删除元素
/*1. 获得插入位置的指针                                                                      
/*2. 判断插入的位置是否合法
/*3. 完成元素的插入
/************************************************************************/

bool deleteElement(PNODE pHead,int pos,int *pVal){
int i = 0 ;
PNODE p = pHead;

while (NULL != p->pNext && i<pos-1)
{
p = p->pNext;
++i;
}

if (i>pos-1 || NULL == p->pNext)
return false;


PNODE q = p->pNext;
*pVal = q->data;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;

return true;
}

原创粉丝点击