数据结构:链表插入和删除算法的演示
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
=============================
*/
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
=============================
*/
相关文章推荐
- 数据结构链表创建,遍历,是否为空,求长度,插入,删除算法的演示
- 【郝斌数据结构自学笔记】27-29_链表插入和删除算法的演示_复习
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 数据结构 P36-37 算法实现 双向循环链表的插入与删除
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 郝斌数据结构 28 链表的插入和删除算法的演示
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 数据结构Java实现 --单向链表的插入和删除
- 链表的插入删除查找(浙大数据结构)
- 左程云_算法与数据结构 — 链表问题 — 03删除链表的中间节点和a/b处的节点
- 单链表的建立、测长、删除、插入、排序、逆置及打印(数据结构)
- 数据结构学习二 数据结构之链表代码版【创建,遍历,删除,插入】
- 数据结构:单链表(二)之链表节点排序,升序插入数据,删除指定的所有节点,翻转链表操作
- 数据结构Java实现03----单向链表的插入和删除
- 数据结构之单向链表操作1-(插入,删除,交换,反转,排序等操作)
- 数据结构之循环链表操作3-(合并,拆分,插入,删除,建立等)
- 数据结构_在一个链表中删除一段插入另一链表