链表操作 (C语言)插入,合并,销毁,删除,冒泡排序
来源:互联网 发布:ps软件怎么安装 编辑:程序博客网 时间:2024/06/15 18:08
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node *next;
}node;//把node 声明为struct Node.
node *add(node *head,int data);
node *ListDelete(node *head,int i);
node *reverse(node *head);
node *buddleSort(node *head);
node *mergeList(node *head1,node *head2,node *head3);
void listDestroy(node *head);
void print(node *head);
int length1(node *head);
int main()
{
node *head1 = NULL;
node *head2 = NULL;
node *head3 = NULL;
int i = 10;
while(i-- > 0)
{
head1 = add(head1,rand()%100);
head2 = add(head2,rand()%100);
}
buddleSort(head1);
buddleSort(head2);
print(head1);
print(head2);
head3 = mergeList(head1,head2,head3);
print(head3);
head3 = reverse(head3);
print(head3);
//listDestroy(head1);
//listDestroy(head2);
listDestroy(head3);
return 1;
}
//合并两个基本有序的链表,到head3
node *mergeList(node *head1,node *head2,node *head3)
{
node *tail = NULL;
if(head1==NULL)
{
head3 = head2;
return head3;
}
else if(head2==NULL)
{
head3 = head1;
return head3;
}
else
{
if(head1->data > head2->data)
{
head3 = head2;
tail = head3;
head2 = head2->next;
}
else
{
head3 = head1;
tail = head3;
head1 = head1->next;
}
}
while(head1&&head2)
{
if(head1->data > head2->data)
{
tail->next = head2;
tail = head2;
head2 = head2->next;
}
else
{
tail->next = head1;
tail = head1;
head1 = head1->next;
}
}
tail ->next = head1 ? head2 : head1;//插入剩余段。
return head3;
}
//用头插完成链表的反转。
node * reverse(node *head)
{
node * tempHead = NULL,*p=NULL;
while(head)
{
p = head;
head = head -> next;
p->next = tempHead;
tempHead = p;
}
return tempHead;
}
//对链表冒泡排序 升序
node *buddleSort(node *head)
{
int len = length1(head);
node *p1 =head,*p2=head,*tempFinish=NULL;
while(len-- > 0)
{
p1 = p2 = head;
while(p2!=tempFinish)
{
p2=p2->next;
if(p2==NULL)
break;
else if(p1->data > p2->data)
{
p1->data = (p1->data)^(p2->data);
p2->data = (p1->data)^(p2->data);
p1->data = (p1->data)^(p2->data);
}
p1 = p2;
}
tempFinish = p1;
}
return head;
}
//添加一个元素
node * add(node *head,int data)
{
node *p = NULL;
if(head==NULL)
{
head = (node*)malloc(sizeof(node));
head->data = data;
head->next = NULL;
}
else
{
p = (node*)malloc(sizeof(node));
p->data = data;
p->next = head;
head = p;
}
return head;
}
//删除一个元素
node * ListDelete(node *head,int i)
{
node *p1,*p2;
if(i>length1(head))
printf("删除位置不正确!");
else
{
p1 = head;
if(i==0)
{
head = head->next;
free(p1);
}
else
{
while(--i > 0)
{
p1 = p1->next;
}
p2 = p1->next;
p1->next = p1->next->next;
free(p2);
}
}
return head;
}
//销毁链表
void listDestroy(node*head)
{
node *p = head;
print(head);
while(head!=NULL)
{
head = head->next;
free(p);
p = head;
}
}
//查看链表长度
int length1(node *head)
{
node *p = head;
unsigned int len=0;
while(p!=NULL)
{
p = p->next;
len++;
}
return len;
}
//打印链表数据
void print(node *head)
{
while(head!=NULL)
{
printf("%d ",head->data);
head = head -> next;
}
printf("\n");
}
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node *next;
}node;//把node 声明为struct Node.
node *add(node *head,int data);
node *ListDelete(node *head,int i);
node *reverse(node *head);
node *buddleSort(node *head);
node *mergeList(node *head1,node *head2,node *head3);
void listDestroy(node *head);
void print(node *head);
int length1(node *head);
int main()
{
node *head1 = NULL;
node *head2 = NULL;
node *head3 = NULL;
int i = 10;
while(i-- > 0)
{
head1 = add(head1,rand()%100);
head2 = add(head2,rand()%100);
}
buddleSort(head1);
buddleSort(head2);
print(head1);
print(head2);
head3 = mergeList(head1,head2,head3);
print(head3);
head3 = reverse(head3);
print(head3);
//listDestroy(head1);
//listDestroy(head2);
listDestroy(head3);
return 1;
}
//合并两个基本有序的链表,到head3
node *mergeList(node *head1,node *head2,node *head3)
{
node *tail = NULL;
if(head1==NULL)
{
head3 = head2;
return head3;
}
else if(head2==NULL)
{
head3 = head1;
return head3;
}
else
{
if(head1->data > head2->data)
{
head3 = head2;
tail = head3;
head2 = head2->next;
}
else
{
head3 = head1;
tail = head3;
head1 = head1->next;
}
}
while(head1&&head2)
{
if(head1->data > head2->data)
{
tail->next = head2;
tail = head2;
head2 = head2->next;
}
else
{
tail->next = head1;
tail = head1;
head1 = head1->next;
}
}
tail ->next = head1 ? head2 : head1;//插入剩余段。
return head3;
}
//用头插完成链表的反转。
node * reverse(node *head)
{
node * tempHead = NULL,*p=NULL;
while(head)
{
p = head;
head = head -> next;
p->next = tempHead;
tempHead = p;
}
return tempHead;
}
//对链表冒泡排序 升序
node *buddleSort(node *head)
{
int len = length1(head);
node *p1 =head,*p2=head,*tempFinish=NULL;
while(len-- > 0)
{
p1 = p2 = head;
while(p2!=tempFinish)
{
p2=p2->next;
if(p2==NULL)
break;
else if(p1->data > p2->data)
{
p1->data = (p1->data)^(p2->data);
p2->data = (p1->data)^(p2->data);
p1->data = (p1->data)^(p2->data);
}
p1 = p2;
}
tempFinish = p1;
}
return head;
}
//添加一个元素
node * add(node *head,int data)
{
node *p = NULL;
if(head==NULL)
{
head = (node*)malloc(sizeof(node));
head->data = data;
head->next = NULL;
}
else
{
p = (node*)malloc(sizeof(node));
p->data = data;
p->next = head;
head = p;
}
return head;
}
//删除一个元素
node * ListDelete(node *head,int i)
{
node *p1,*p2;
if(i>length1(head))
printf("删除位置不正确!");
else
{
p1 = head;
if(i==0)
{
head = head->next;
free(p1);
}
else
{
while(--i > 0)
{
p1 = p1->next;
}
p2 = p1->next;
p1->next = p1->next->next;
free(p2);
}
}
return head;
}
//销毁链表
void listDestroy(node*head)
{
node *p = head;
print(head);
while(head!=NULL)
{
head = head->next;
free(p);
p = head;
}
}
//查看链表长度
int length1(node *head)
{
node *p = head;
unsigned int len=0;
while(p!=NULL)
{
p = p->next;
len++;
}
return len;
}
//打印链表数据
void print(node *head)
{
while(head!=NULL)
{
printf("%d ",head->data);
head = head -> next;
}
printf("\n");
}
0 0
- 链表操作 (C语言)插入,合并,销毁,删除,冒泡排序
- 数据结构----单向链表之 新建-插入-删除-排序(选择法)-合并-删除-销毁
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 线性表的操作(完成表的建立,插入,删除,排序,销毁,查找 )
- 单向链表的操作:创建,删除,插入,销毁,查找
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- c语言链表的创建、插入、删除、排序
- 数据结构-数组排序(冒泡 选择 插入 归并(合并有序数组))-C语言
- C语言---双向链表的插入、删除、查找操作
- C语言---双向链表的插入、删除、查找操作
- C语言实现链表插入,删除相关操作
- 顺序链表的插入删除等操作 C语言
- C语言实现链表的插入、删除、查询操作
- C语言排序实例(选择、冒泡、插入、折半、快速)
- C语言排序实例(选择、冒泡、插入、折半、快速)
- c语言排序实例(选择、冒泡、插入、折半、快速)
- C语言排序实例(选择、冒泡、插入、折半、快速)
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 湖北省再度出资2000万 扶持大学生创业
- LeetCode --- 104. Maximum Depth of Binary Tree
- Windows 下编程检测显示器信息及插拔
- Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名
- 浏览器定位原理与实现
- 链表操作 (C语言)插入,合并,销毁,删除,冒泡排序
- LeetCode --- 105. Construct Binary Tree from Preorder and Inorder Traversal
- 博弈论问题,弱弱的分析
- 关于android.view.WindowLeaked(窗体泄露)的解决方案
- MySQL修改复制用户及密码
- 集合 17天
- IOS-GCD的一点认识
- jquery 简单的进度条实现代码
- iOS 面试题