㈠ c语言的链表怎么排序
其实最简单的方法就是,重新建一个链表存储有序序列,把原链表里的元素一个一个地取出来,放到新链表里。放进去的时候二分一下当前序列(可能要比二分数组慢一点,因为要一个一个地往前或者往后找,没有直接按下标找方便),找到当前元素在序列里正确的位置。这种方法的时间复杂度大概在O(n*log2n)左右
基本流程:
初始状态:
原链表:1--->2--->4--->3--->NULL
新链表:NULL
第一次处理:
原链表:2--->4--->3--->NULL
新链表:1--->NULL
第二次处理:
原链表:4--->3--->NULL
新链表:1--->2--->NULL
第三次处理:
原链表:3--->NULL
新链表:1--->2--->4--->NULL
第四次处理:
原链表:NULL
新链表:1--->2--->3--->4--->NULL
或者建一个二叉树,类似于bst的结构(左子<根<右子),再中序遍历一下。
或者不用那些基于比较的排序,用基数排序一类的方法,可以在O(n)的时间内解决问题C+_+C
㈡ C语言中链表的存储、读取、修改问题
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
㈢ C语言链表的读取
把你的主函数和操作步骤贴出来呗
㈣ c语言链表的建立和顺序访问各节点的数据域
#include<stdio.h>
#include<stdlib.h>
typedefstructstudent
{
intscore;
structstudent*next;
}student;
student*creatlist()
{
inti=0;
student*head,*p,*q;
head=(student*)malloc(sizeof(student));
p=head;
scanf("%d",&i);
while(i!=-1)
{
q=(student*)malloc(sizeof(student));
q->score=i;
p->next=q;
p=q;
scanf("%d",&i);
}
p->next=NULL;
returnhead;
}
voidprint(student*head)
{
if(!head)return;
student*p=head->next;
while(p)
{
printf("%d",p->score);
p=p->next;
}
}
intmain()
{
student*head;
head=creatlist();
print(head);
system("pause");
return0;
}
㈤ 顺序表和链表的基本操作,用C语言实现!
顺序存储的线性表的算法
#include "stdio.h"
#include "stdlib.h"
#define Status int
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 100
typedef int ElemType;
typedef struct list
{ElemType elem[MAXSIZE];
int length;
}SqList;
void InitList(SqList &L){
L.length=0;
}
/*建立顺序表*/
void CreateList(SqList &L)
{
int i;
printf("input the length");
scanf("%d",&L.length);//输入表长
for(i=1;i<=L.length;i++)
scanf("%d",&L.elem[i-1]);//输入元素
}
//顺序表的遍历
void printdata(ElemType e){
printf("%4d",e);
}
void Traverse(SqList L,void (*visit)(ElemType e))
{ int i;
printf("The elements of the lists are:\n");
for(i=1;i<=L.length;i++){
if (i%10==0)printf("\n");//每行显示10个元素
visit(L.elem[i-1]);//输出表中元素
}
printf("\n");
}
//有序顺序表L中插入元素e使序列仍有序
void Insert(SqList &L,ElemType e)
{int i,j;
if (L.length==MAXSIZE)exit(OVERFLOW);//表满,不能插入
for(i=1;i<=L.length&&L.elem[i-1]<=e;i++);//向后查找
for(j=L.length;j>=i;j--)
L.elem[j]=L.elem[j-1];//元素后移
L.elem[i-1]=e;//插入e
L.length=L.length+1;//表长加1
}
//建立递增有序的顺序表
void CreateList_Sorted(SqList &L)
{int i,num;
ElemType e;
L.length=0;
printf("Create a sorted list,Input the length of the list\n");
scanf("%d",&num);
printf("Input the data %d numbers\n",num);
for(i=1;i<=num;i++){
scanf("%d",&e);
Insert(L,e);
}
}
/*Merge two sorted lists*/
void MergeList(SqList La,SqList Lb,SqList &Lc)
{int *pa,*pb,*pc;
if (La.length+Lb.length>MAXSIZE) exit(OVERFLOW);
else
{pa=La.elem;pb=Lb.elem;pc=Lc.elem;
while (pa<La.elem+La.length&&pb<Lb.elem+Lb.length)
*pc++=(*pa<=*pb)?*pa++:*pb++;/*公共部分合并*/
while (pa<La.elem+La.length) *pc++=*pa++;
/*R1表的剩余部分放到R的后部*/
while (pb<Lb.elem+Lb.length) *pc++=*pb++;
/*R2表的剩余部分放到R的后部*/
Lc.length=La.length+Lb.length;/*R表长*/
}
}
//判断元素是否对称,对称返回TRUE 否则返回FALSE
Status Symmetric(SqList L)
{int low,high;
low=0;
high=L.length-1;
while(low<high)
if (L.elem[low]==L.elem[high]){low++;high--;}
else return(FALSE); return(TRUE); }
//顺序表的主函数部分
//#include "seqlist.h"
void main()
{SqList L1,L2,L;
int select;
ElemType e;
do{printf("\n1 insert 2 merge");
printf("\n3 symmetric 0 exit \n");
printf("Please select(0--3)\n");
scanf("%d",&select);
switch(select){
case 1:
InitList(L);
CreateList_Sorted(L);
Traverse(L,printdata);
printf("\nInput the element of inserted\n");
scanf("%d",&e);
Insert(L,e);
Traverse(L,printdata);
break;
case 2:
InitList(L1);
CreateList_Sorted(L1);
Traverse(L1,printdata);
InitList(L2);
CreateList_Sorted(L2);
Traverse(L2,printdata);
InitList(L);
MergeList(L1,L2,L);
Traverse(L,printdata);
break;
case 3:
InitList(L);
CreateList(L);
Traverse(L,printdata);
if (Symmetric(L)) printf("Yes!\n"); else printf("Not\n");
break;
case 0:break;
default:printf("Error! Try again!\n");
}
}while(select);
}
/*单向链表的有关操作示例*/
/*类型定义及头文件部分,文件名为sllink.h*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;//元素实际类型
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //定义结点、指针类型名
//头插法建立无序链表
void CreateList(LinkList &L){
LinkList p;
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("头插法建立链表,以0结束\n");
scanf("%d",&e);
while(e){
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=L->next;
L->next=p;
scanf("%d",&e);
}
}
/*非递减有序单向链表L插入元素e序列仍有序*/
void Insert_Sort(LinkList &L,ElemType e){
LinkList p,s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
p=L;
while(p->next&&p->next->data<=e)
p=p->next;/*查找插入位置*/
s->next=p->next; /*插入语句*p结点后插入*s结点*/
p->next=s;
}
/*建立递增有序的单向链表*/
void Create_Sort(LinkList &L){
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("建立有序表,输入任意个整型数据以0结束\n");
scanf("%d",&e);
while(e){
Insert_Sort(L,e);
scanf("%d",&e);
}
}
/*单向链表的遍历*/
void Traverse(LinkList L){
LinkList p;
printf("遍历链表");
for(p=L->next;p;p=p->next)
printf("%5d",p->data);
printf("\n");
}
/*在单向链表删除元素e*/
void Delete(LinkList &L,ElemType e){
LinkList p,q;
p=L;
q=L->next;
while(q&& q->data!=e){//查找元素的删除位置
p=q;
q=q->next;
}
if(!q) printf("\nnot deleted");/*未找到元素e*/
else {p->next=q->next;/*找到删除*/
free(q);}
}
/*单向链表的逆置*/
void exch(LinkList &L){
LinkList p,s;
p=L->next;
L->next=NULL;
while(p){
s=p;
p=p->next;
s->next=L->next;
L->next=s;
}
}
/*两个非递减有序单向链表合并后仍为非递减序列*/
void MergeIncrease(LinkList La,LinkList Lb,LinkList &Lc){
LinkList p,q,s,rear;
p=La->next;
q=Lb->next;
Lc=rear=La;
free(Lb);
while(p&&q){
if (p->data<q->data) {s=p;p=p->next; }
else {s=q;q=q->next; }
rear->next=s;/*较小元素插入表尾*/
rear=rear->next;
}
if (p) rear->next=p; else rear->next=q;
}
/*主函数部分,文件名为sllink.c*/
//#include "sllink.h"
void main(){
LinkList La,Lb,Lc;
ElemType e;
int select;
do{
printf(" 1 建立无序表,再删除指定元素\n");
printf(" 2 建立递增有序表,再逆置\n");
printf(" 3 建立两个递增有序表,将它们和并为一个仍递增表\n");
printf(" 0 退出,请输入选项(0-3)\n");
scanf("%d",&select);
switch(select){
case 0:
break;
case 1:
CreateList(La);
Traverse(La);
printf("输入需删除的元素\n");
scanf("%d",&e);
Delete(La,e);
Traverse(La);
break;
case 2:
Create_Sort(La);
Traverse(La);
exch(La);
printf("The list that is exchaged\n");
Traverse(La);
break;
case 3:
Create_Sort(La);Traverse(La);
Create_Sort(Lb);Traverse(Lb);
MergeIncrease(La,Lb,Lc);Traverse(Lc);
break;
default:
printf("输入选项错误,请重新输入!\n");
}
}while(select);
}
这些内容不知道能不能帮助到你。
㈥ C语言 链表怎么排序 急求大虾
排序!这是一个庞大的话题,有插入排序,插入排序又分直接插入排序、希尔排序等,还有交换排序,交换排序有冒泡排序、快速排序,还有选择排序,有直接选择排序、归并排序等等…而且还不断的有新的排序方法产生…不知道你要哪一种…新手一般用选择排序和冒泡排序,方法简单,两重循环。