您的位置:首页 > 理论基础 > 数据结构算法

数据结构:链表插入和删除算法的演示

2012-11-07 19:54 573 查看
1 # include <stdio.h>
2 # include <malloc.h>
3 # include <stdlib.h>
4
5 typedef struct Node //要理解typedef的用法
6 {
7 int data;
8 struct Node * pNext;
9 }NODE, * PNODE;
10 PNODE creat(void);
11 void traverse(PNODE pHead); //注意函数的返回值类型
12 bool empty(PNODE pHead);
13 int length(PNODE);
14 bool insert(PNODE, int, int);
15 bool delet(PNODE, int, int *);
16 void sort(PNODE);
17
18 int main(void)
19 {
20 PNODE pHead = NULL;
21 int len;
22 int val;
23 pHead = creat();
24 traverse(pHead);
25 if(empty(pHead))
26 printf("空\n");
27 else
28 printf("不空\n");
29 len = length(pHead);
30 printf("链表的长度是%d\n",len);
31 sort(pHead);
32 traverse(pHead);
33 insert(pHead,3,31);
34 traverse(pHead);
35 if(delet(pHead,3,&val))
36 {
37 printf("删除成功,您删除的元素为:%d!\n",val);
38 }
39 else
40 {
41 printf("删除失败~");
42 }
43 traverse(pHead);
44
45 return 0;
46
47 }
48 PNODE creat(void)
49 {
50 int len;
51 int i;
52 int val;
53 PNODE pHead = (PNODE)malloc(sizeof(NODE));
54 if(NULL == pHead)
55 {
56 printf("分配失败,程序终止");
57 exit(-1);
58 }
59 PNODE pTail = pHead;
60 pTail->pNext = NULL;
61 printf("请输入链表节点长度:len= ");
62 scanf("%d",&len);
63 for(i=0;i<len;i++)
64 {
65 printf("请输入第%d个值",i+1);
66 scanf("%d",&val);
67 PNODE pNew = (PNODE)malloc(sizeof(NODE));
68
69 if(NULL == pNew)
70 {
71 printf("分配失败,程序终止");
72 exit(-1);
73 }
74 pNew->data = val;
75 pTail->pNext = pNew;
76 pNew->pNext= NULL;
77 pTail = pNew; //算法要理解,可借助图形加上理解
78
79 }
80 return pHead; // 返回值
81
82 }
83
84 void traverse(PNODE pHead)//遍历
85 {
86 PNODE p = pHead->pNext;
87
88 while(NULL != p)
89 {
90 printf("%d ",p->data);
91 p = p->pNext; //移到下一个节点
92
93 }
94 printf("\n");
95
96 }
97 bool empty(PNODE pHead) //判断是否为空
98 {
99 if(NULL == pHead->pNext)
return true;
else
return false;
}
int length(PNODE pHead)
{
PNODE p = pHead->pNext;
int len = 0;

while(NULL != p)
{
++len;
p = p->pNext;
}
return len;

}
void sort(PNODE pHead)//排序
{
int i,j,t;
int len;
PNODE p,q;
len = length(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(q->data > p->data)
{
t = q->data;
q->data = p->data;
p->data=t;
}

}
}
return;
}
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;
}
bool delet(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;

}
/*
=============================
请输入链表节点长度:len= 4
请输入第1个值23
请输入第2个值54
请输入第3个值12
请输入第4个值33
23 54 12 33
不空
链表的长度是4
54 33 23 12
54 33 31 23 12
删除成功,您删除的元素为:31!
54 33 23 12
Press any key to continue
=============================
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐