三九宝宝网宝宝教育教学论文

c语言动态链表如何实现排序

02月28日 编辑 39baobao.com

[用C语言实现链表的算法]这个是我们数据结构上机实验的链表问题, #include<stdio.h> #include<malloc.h> #define LEN sizeof(LinkNode) typedef int Datatype; typedef int Status; typedef struct...+阅读

typedef struct node{

int data;

struct node *next;

}node;

node *create()

{

node *head,*p,*q;

int i=0;

int x;

head=(node *)malloc(sizeof(node));

while(1)

{

printf("please input the node:");

scanf("%d",&x);

if(x==0) {break;}

p=(node *)malloc(sizeof(node));

p->data=x;

if(++i==1)

{

head->next=p;

}

else

{

q->next=p;

}

q=p;

}

q->next=NULL;

return head;

}

void print(node *head)

{

node *p;

int index=0;

if(head->next==NULL)

{

printf("Link is empty!\n");

exit(0);

}

p=head->next;

while(p!=NULL)

{

printf("the %d node is %d\n",++index,p->data);

p=p->next;

}

}

int length(node *head)

{

int len=0;

node *p;

p=head->next;

while(p)

{

len++;

p=p->next;

}

return len;

}

node *insert(node *head,int pos,int x)

{

node *p,*q=NULL;

q=(node *)malloc(sizeof(node));

q->data=x;

if(pos==0)

{

head->next=q;

return head;

}

p=search(head,pos);

if(p!=NULL)

{

q->next=p->next;

p->next=q;

}

return head;

}

利用链表怎样实现数据的插入排序统计更改等等

例:#include#include//创建链表 struct Node { int data; struct Node *next; }; struct Node *head=NULL;//创建头结点为空 void createLinkList() { int num; struct Node *p;//声明一个结点 printf("\n请输入链表中的元素,输入-1结束\n"); scanf("%d",&num);//使用scanf函数输入数据 while(num!=-1)//判断链表是否结束 { p=(struct Node*)malloc(sizeof(struct Node));//为结点p分配一个内存空间 p->data=num;//为结点p中的数据赋值 p->next=head->next;//将p结点插入到头结点后面去 head->next=p; scanf("%d",&num);//继续输入数据 } } void dispaly() { struct Node *p =head->next; printf("链表中的元素为\n"); while(p!=NULL)//判断结点是否为空 { printf("%d\t",p->data);//输出结点中的数据 p=p->next;//指针下移 } } int getLength()//统计链表中有多少个结点 { int num=0;//声明计数器counter用来存放结点的个数 struct Node *p;//声明结点 p=head->next; while(p!=NULL)//判断结点是否为空 { num++;//计数器自加1 p=p->next;//指针下移,继续判断 } return num;//返回结点个数 } int insert(int index ,int data)//定义insertNode方法插入结点 { if(index>getLength()||indexdata=data;//把要插入的数据赋值到等待插入的结点 //插入结点 q->next=p->next; p->next=q; return 1; } int deletel(int data)//定义deletel方法删除结点 { struct Node *p ,*q;//声明q、p两个结点 int i; p=head->next; q=head->next; for( i = 0; idata) break; else//如果结点不是要删除的结点,继续往下查找 { q=p; p=p->next; } } if(inext=p->next; free(p);//释放被删除结点的空间 return 1; } return 0; } void main() { int data,index;//声明各种数据类型 struct Node *p;//声明结点指针 p=(struct Node*)malloc(sizeof(struct Node));//为结点指针p分配一个内存空间 p->next=NULL;//初始化结点p head=p;//将结点p设置为头结点 createLinkList();//调用createLinkList方法创建链表 dispaly();//输出链表 printf("请输入要插入的数据:"); scanf("%d",&data); printf("请输入要插入的位置:"); scanf("%d",&index); if(insert(index,data)==1) printf("插入成功"); else printf("插入失败!!"); dispaly(); printf("请输入要删除的数据"); scanf("%d",&data);//输入要删除的数据,赋值给data if(deletel(data)==1)//调用deleteLinkList方法删除结点 { printf("删除成功"); } else printf("删除失败"); dispaly();//输出链表 }

简单链表的排序

请看ListSort3(L); 程序初始顺序是:6 3 67 2 15 13 10 6 4排好序的顺序是:3 2 4 6 6 67 15 13 10#include#include#include/************************************************************************/ /* 常量定义 */ /************************************************************************/ #define ElemType int #define Status int #define TRUE 1 #define OK 1 #define FALSE 0 #define ERROR -1 /************************************************************************/ /* 线性表的单链表存储结构*/ /************************************************************************/ typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; /************************************************************************/ /* 操作结果:构造一个空的线性表L */ /************************************************************************/ void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */ if( !*L ) /* 存储分配失败 */ exit(OVERFLOW); (*L)->next = NULL; /* 指针域为空 */ } /************************************************************************/ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */ /************************************************************************/ Status ListInsert(LinkList L, int i, ElemType e) { int j = 0; LinkList p = L, s; while( p & jnext; j++; } if( !p|| j >i-1) return ERROR;/* i小于1或者大于表长 */ s = (LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */ s->data = e; /* 插入L中 */ s->next = p->next; p->next = s; return OK; } /************************************************************************/ /* 初始条件:线性表L已存在。

操作结果:依次对L的每个数据元素调用函数vi() */ /************************************************************************/ void ListTraverse(LinkList L, void(*vi)(ElemType)) { LinkList p = L->next; while(p) { vi(p->data); p = p->next; } printf("\n"); } void printInt(int data) { printf("%d ", data); } void ListSort3(LinkList L) { LinkList first; //指向链表L第一个结点,除头结点 LinkList pre; //指向first的前驱结点 LinkList last; //指向first指向排好序的最后一个结点 LinkList rest; //指向未排好序的第一个结点,即链表第二个结点 LinkList curr; //指向当前结点 first = L->next; //指向第一个结点 if(first == NULL) return; pre = L ; //pre指向first的前驱结点 last = first; //last指向排好序的最后一个结点 rest = first->next; //指向剩余的结点 first->next = NULL; //first断链 while (rest) //当余下的结点不为空 { //保存当前结点 curr = rest; //取下一个结点 rest = rest->next; //当结点小于第一个结点,则链接到first前面 if( curr->datadata ) { pre->next = curr; curr->next = first; pre = curr; } //当前结点大于第一个结点,则链接到last后 else if(curr->data >first->data) { curr->next = last->next; last->next = curr; last = curr; } //当前结点与第一个结点相等,则链接到first后面 else { curr->next = first->next; first->next = curr; } } } void main() { LinkList L; InitList(&L); ListInsert(L, 1, 6); ListInsert(L, 2, 3); ListInsert(L, 3, 67); ListInsert(L, 4, 2); ListInsert(L, 5, 15); ListInsert(L, 6, 13); ListInsert(L, 7, 10); ListInsert(L, 8, 6); ListInsert(L, 9, 4); ListSort3(L); ListTraverse(L, printInt); }

链表的选择排序

C语言 经典算法--单链表选择排序第一种:#include#includetypedef struct node{ int data; struct node *next; }*Linklist,Node; Linklist creat(int n) {Linklist head,r,p; int x,i; head=(Node*)malloc(sizeof(Node)); r=head; printf("输入数字:\n"); for(i=n;i>0;i--) {scanf("%d",&x); p=(Node*)malloc(sizeof(Node)); p->data=x; r->next=p; r=p;} r->next=NULL; return head; } void output(Linklist head) {Linklist p; p=head->next; do{ printf("%3d",p->data);p=p->next; }while(p); printf("\n"); } void paixu(Linklist head) {Linklist p,q,small;int temp; for(p=head->next;p->next!=NULL;p=p->next) {small=p; for(q=p->next;q;q=q->next) if(q->datadata) small=q; if(small!=p) {temp=p->data; p->data=small->data; small->data=temp;} } printf("输出排序后的数字:\n"); output(head); } void main() {Linklist head; int x,j,n; printf("输入数字的个数(n):\n"); scanf("%d",&n); head=creat(n); printf("输出数字:\n"); output(head); printf("已排序的数字:\n"); paixu(head); } 第二种:#include#includetypedef struct node{ int data; struct node *next; }*Linklist,Node; Linklist creat(int n) {Linklist head,r,p; int x,i; head=(Node*)malloc(sizeof(Node)); r=head; printf("输入数字:\n"); for(i=n;i>0;i--) {scanf("%d",&x); p=(Node*)malloc(sizeof(Node)); p->data=x; r->next=p; r=p;} r->next=NULL; return head; } Linklist selectsort(Node *g) { Node *p,*q,*t,*s,*h; h=(Node *)malloc(sizeof(Node)); h->next=g; p=h; while(p->next->next!=NULL) { for(s=p,q=p->next;q->next!=NULL;q=q->next) if(q->next->datanext->data) s=q; if(s!=q) { t=s->next; s->next=t->next; t->next=p->next; p->next=t; } p=p->next; } g=h->next; free(h); return g; } void output(Linklist head) {Linklist p; p=head->next; do{ printf("%3d",p->data);p=p->next; }while(p); printf("\n"); } void main() {Linklist head; int x,j,n; printf("输入数字的个数(n):\n"); scanf("%d",&n); head=creat(n); printf("输出数字:\n"); output(head); head=selectsort(head); printf("已经排序的数字:\n"); output(head); }

以下为关联文档:

用C语言实现数据结构中常用算法如对链表的操作查找排序#include <iostream.h> class ram { public: char wenzi[200]; ram *p; }; ram wo,*ai=&wo; int num=0;//我申请了几次内存了 void xie(void);//输入数据,然后分配内存为下次做...

用C语言描述如何实现基数排序/*1.基数是利用同位比较的排序算法,时空复杂度都比较低,很适合字母字符串排序2.比如对int数组用以1和0为基数排序,先比较第一位,0位靠前1位靠后,一直排完32位3.基数排序不需要特...

c语言里用递归实现链表反向打印打开NewContactList工程文件, 相关的修改的程序文件如下(未修改的没有post 上去)。 ContactList.h文件如下: /* *ContactList.h * * created on Jul 6, 2014 * Author: *** * *...

使用C语言实现动态数组你的太乱了的吧 二维数组,其实实质是一位数组横排 为啥用两个for循环,我看了会头晕,你的太乱了 #include #include int main() { int *p; int m,n; scanf("%d%d",&m,&n); p = (in...

帮忙做道C语言的题双向链表的排序#includetypedef struct Link/*双向链表结构体*/{ int data; struct Link *lift; struct Link *right;}linkx,*linky;linky Init();/*建立双向链表*/void PrLink(linky p);/*输...

求高手做个c语言设计一个双向链表的排序#includetypedef struct Link/*双向链表结构体*/ { int data; struct Link *lift; struct Link *right; }linkx,*linky; linky Init();/*建立双向链表*/ void PrLink(linky p)...

c语言课程设计双向链表排序#includetypedef struct Link/*双向链表结构体*/{ int data; struct Link *lift; struct Link *right;}linkx,*linky;linky Init();/*建立双向链表*/void PrLink(linky p);/*输...

使用C语言编程实现排序算法#include<stdio.h> main() { struct { char mz[5]; int sd; char sbing[5]; int xs; }a[100],k; int i,b,j; printf("请输入球员数量\n"); scanf("%d",&b); for(i=0;i<b;i++) {pri...

C语言实现冒泡排序选择排序插入排序及其移动次数你说的排序我给你源代码,在代码里面简单的说了一下算法思想。如果是要学习,我建议去看书和看别人的博客,明白排序的思想,只有明白了算法的思想,才能轻易的看懂排序的代码。我的代...

推荐阅读
图文推荐