㈠ 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語言 鏈表怎麼排序 急求大蝦
排序!這是一個龐大的話題,有插入排序,插入排序又分直接插入排序、希爾排序等,還有交換排序,交換排序有冒泡排序、快速排序,還有選擇排序,有直接選擇排序、歸並排序等等…而且還不斷的有新的排序方法產生…不知道你要哪一種…新手一般用選擇排序和冒泡排序,方法簡單,兩重循環。