链表(数据结构C语言写法) 完全版

//@author lyz 2013年1月9日
#include
#include//分配内存
#include

typedef struct Node{
int date;//数据域
struct Node * pNext;//指针域
}NODE,* PNODE; //NODE等价于struct Node

//函数声明
PNODE create_list (void);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
void sort_list (PNODE pHead);
bool insert_list(PNODE pHead ,int pos,int val);
bool delect_list(PNODE,int,int *);

int main(void){
PNODE pHead = NULL;//等价于struct Node * pHead =NULL;
pHead = create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
traverse_list(pHead);//遍历
if(is_empty(pHead))
printf("链表为空\n");
else
printf("链表不为空\n");

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

sort_list (pHead);
traverse_list(pHead);
insert_list(pHead,4,33);
printf("插入结点\n");
traverse_list(pHead);
len = length_list(pHead);
printf("链表的长度是%d\n",len);

int val;
if(delect_list(pHead,4,&val))
printf("删除成功,删除的元素师:%d\n",val);
else
printf("删除失败!\n");
traverse_list(pHead);
len = length_list(pHead);
printf("链表的长度是%d\n",len);

return 0;
}

//创建链表
PNODE create_list (void){
int len; //用来存放有效地结点数
int i;
int val; //用来临时存放用户输入的结点的值

//分配了一个不存放有效数据的头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead){
printf("分配失败,程序终止!\n");
exit(-1);
}
//创建尾结点
PNODE pTail = pHead;
pTail->pNext = NULL;

printf("请输入你需要生成的结点的个数:len=");
scanf("%d",&len);

for(i=0;iprintf("请输入第%d个结点的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew){
printf("分配失败,程序终止!\n");
exit(-1);
}

pNew->date = val;
pTail ->pNext = pNew;//pTail为尾结点
pNew ->pNext = NULL;
pTail = pNew;
}
return pHead;
}

//遍历
void traverse_list(PNODE pHead){

PNODE p = pHead->pNext;

printf("链表为:");
while (p != NULL ){

printf("%d ",p->date);
p = p->pNext;
}
printf("\n");
return;//函数执行完毕
}

//判断链表是否为空
bool is_empty(PNODE pHead){
if(NULL == pHead->pNext)
return true;
else
return false;
}

//求链表的长度
int length_list(PNODE pHead){
PNODE p = pHead->pNext;
int len = 0;
while (p != NULL ){

len++;
p = p->pNext;
}

return len;
}

//排序
void sort_list (PNODE pHead){
int i,j,t;
int len = length_list(pHead);
PNODE p,q;
for(i=0,p=pHead->pNext;ipNext)
for(j=i+1,q=p->pNext;jpNext)
if(p->date > q->date){
t=p->date; //类似于数组中的t=a[i]
p->date = q->date;//类似于数组

中的a[i] = a[j];
q->date = t; //类似于数组中的a[j] = i;
}
return;
}

//在pHead所指向链表的第pos个结点的前面插入一个新的结点,该结点的值是val,并且pos的值从1开始
bool insert_list(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->date = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;

return true;
}

bool delect_list(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->date;
//删除p结点后的结点
p->pNext =p->pNext->pNext; //p->pNext =q->pNext;
free(q);
q = NULL;

return true;

}

相关文档
最新文档