㈠ 鏈表排序的演算法
我看過了程序,覺得思想應該是這樣的,9次遍歷該鏈表。每次找出一個MAX,並將他賦給一個新的結點,同時刪除原鏈表中這個最大值。
最後將這些新的接點組成一個鏈表,就是排好序的。
現在來看看程序中的錯誤,主要是在排序中:
⒈while條件錯誤,假如是temp!=NULL,想一想遍歷到鏈表最一個值,這時temp不為NULL,而temp->next為NULL,while循環中用到了這個,所以程序崩潰。修改方法:該while條件,或是改循環中的temp->next。
⒉swaptemp->next=swaptemp->next->next;錯誤,會使程序崩潰,理由同上,應該是swaptemp->data=max;swaptemp=swaptemp->next;
⒊對max的處理應該放在while循環外面,這樣才能對最大的max處理。
程序看上去比較得亂,也就沒有調試,說了這么多你應該能自己調試成功吧。再說一下,盡量不要讓程序有警告,有時警告也會讓你的程序無法正常運行!
㈡ 單鏈表的元素插入演算法
#include <stdlib.h>#include<stdio.h>typedef struct LNode{
int data;
LNode *next;
}*List,LNode;void Creat(List &L,int n){//創建鏈表
List p;//用於循環創建的節點
L=(List)malloc(sizeof(struct LNode));
L->next=NULL;
for(int i=1;i<=n;i++){
p=(List)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next =L->next;
L->next=p;
}
}//創建成功void Print(List L3){
L3=L3->next;
while(L3){
printf("%d",L3->data);
L3=L3->next;
}
}void Insert(List &L,int i,int e){//在第i個位置之前插入e
List p,s;
p=L;
int j=0; while(p&&j<=i-1){
if(j==i-1){
s=(List)malloc(sizeof(struct LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
j++;
p=p->next;
}
}
int main(){ List L;
int n,i,e;
scanf("%d,%d,%d",&n,&i,&e);
Creat(L,n);
Insert(L,i,e);
Print(L); return 0;
}1
㈢ 建立一個單鏈表,並求其長度的演算法描述
int Length(PLNode head)/*求長度*/
{
int n=0;
PLNode p;
p=head->next;
while(p)
{
n++;
p=p->next;
}
從頭節點開始,遍歷鏈表,如果未到鏈表末尾,則長度加一,如此反復,知道鏈表結尾
㈣ 鏈表演算法題
因為我是學習計算機軟體專業的,故我可以很負責地告訴你,你的這個大作業肯定是不會有人滿足你的。因為從編程的角度上講,使用任何一種語言編寫帶有一定復雜功能的任何程序,實際本質上都是一項艱苦的腦力勞動。
首先暫且不談到底是 C++ 語言、還是 JAVA 語言?因為該問題已經不僅僅是涉及到到底是使用哪一種具體的編程語言來實現其對應功能的事情了。你的要求中還涉及到在編程過程中需要用到的很多計算機軟體的理論知識。例如:數據結構和演算法的設計(例如:鏈表的創建、排序等)、整個程序總體的設計風格、以及即使你在集成編程環境下面錄入完全部的程序源代碼,但是程序肯定是必須要經過一系列的不斷調試(例如:在可疑的語句處設置斷點、單步跟蹤等)、編譯、鏈接,直到運行出最終的正確結果。
故別的任何人無法幫助你實現你的程序功能,只能夠依靠自己的刻苦努力來完成該大作業了。
㈤ 求幾個有關鏈表的最基本演算法
這個也太多了!
1.循環單鏈表,且含有頭結點的
p = head->next;
for(len=0;p->next!=head;p=p->next)
{
len++ //長度加1
}
2.插入
Status ListInsert(DuLinkList L, int i, ElemType e)
{
DuLinkList p, s;
//i值不合法
if(i < 1 || i > ListLength(L) + 1) return ERROR;
//在L中確定第i個元素前驅的位置指針p
p = GetElemP(L, i - 1);
//p=NULL,即第i個元素的前驅不存在(設頭結點為第1個元素的前驅)
if(!p) return ERROR;
//給插入的數據分配空間
s = (DuLinkList)malloc(sizeof(DuLNode));
//如果為空,分配失敗
if(!s) return OVERFLOW;
//在第i-1個元素之後插入
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return OK;
}
刪除
Status ListDelete(DuLinkList L,int i,ElemType *e)
{
DuLinkList p;
// i值不合法
if(i < 1) return ERROR;
// 在L中確定第i個元素的位置指針p
p = GetElemP(L, i);
// p=NULL,即第i個元素不存在
if(!p) return ERROR;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}
3.帶有頭結點
p=head->next;
head->next =NULL;
q= head;
while(p)
{
q->next = p;
q = p;
p=p->next
}
4.帶頭結點
p=head->next;
head->next = head;
q = head;
while(p!=head)
{
if(head->next = head){q->next=p;q->next = head;}
else{q->next = p;}
q = p;
}
5.帶頭結點
p = head->next;
p->prior = NULL;
q = head;
while(p)
{
q->prior = p;
q->next = p->next;
p->next->prior = q;
p->next = q;
}
㈥ 統計單鏈表結點個數的演算法要解釋…
給你一個完整的代碼,包括鏈表的創建,輸出和求鏈表長度 #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }NODE,*List; void initList(List L) { L = NULL; } List createList() { List head, p, q; int flag; head = (List)malloc(sizeof(NODE)); head->next = NULL; q = head; printf("請輸入節點的值,輸入字母終值輸入: "); flag = scanf("%d", &q->data); while(flag) { p = (List)malloc(sizeof(NODE)); printf("請輸入節點的值: "); flag = scanf("%d", &p->data); q->next = p; p->next = NULL; q = q->next; } return head; } int listLength(List L) { int count = 0; List p = L; while (p->next != NULL) { p = p->next; count++; } return count; } void displayList(List L) { printf("鏈表中的元素為:\n"); while (L->next != NULL) { printf("%d ", L->data); L = L->next; } printf("\n"); } void main() { List L; L = createList(); printf("鏈表的長度為: %d\n", listLength(L)); displayList(L); }
㈦ 數據結構關於單鏈表演算法問題
typedef
int
ElemType;
typedef
struct
LNode
/*定義鏈表結點類型*/
{
ElemType
data;
struct
LNode
*
next;
}LNode,
*
LinkList;
void
Output_des(LinkList
*head)
{//按值遞減的次序逐個輸出head中各結點的數據元素,同時釋放該結點空間。利用簡單的插入排序思想。
LNode
*q,*pre_q,*p,*pre_p;//q指向元素值最大的結點,pre_q指向q結點的前驅結點,pre_p指向p所指結點的前驅
while((*head)->next!=NULL)
{//單鏈表不空,輸出表中元素
q=(*head)->next
;//初始化q指向第一個結點
pre_q=(*head);//pre_q指向q的前驅即頭結點
p=q->next
;//p指向q的後繼結點
pre_p=q;
while(p!=NULL)
{//找出鏈表中值最大的結點
if(p->data>q->data)
{//如果p所指結點的元素值大於q所指結點的元素值,那麼將q指向p所指的結點,同時移動pre_q
pre_q=pre_p;
q=p;
}
pre_p=p;
p=p->next;//p和pre_p移動到下一個結點
}
printf("%d\t",q->data);//輸出元素值
pre_q->next=q->next;//刪除最大的結點q
free(q);//釋放該結點
}
free(*head);//釋放頭結點
}
㈧ 演算法中的鏈表到底是什麼,用處在哪裡
鏈表由多個結點連接而成,一個結點分為數據域和指針域,數據域存儲數據,指針域存儲下一個結點的內存地址。鏈表結點的內存地址可以不連續,可以充分利用內存空間,代價是查找慢,必須從頭結點開始查找。
㈨ 編寫鏈表演算法
直接利用兩個指針,指向兩個節點,p1
p2,p1指向兩者較大的,最後p1所指向的就是
表中值最大的節點:
typedef
struct
node
{
int
elem;
struct
node*
next;
}node;
//*****************初始化表*******************
void
initlink(node*
&l)
{
l
=
new
node;
l->next
=
null;
}
//*****************創建表**********************
void
creatlink(node*
l)
{
cout<<"請輸入表數據,以-1結束輸入:"<
>s->elem,s->elem
!=
-1)
{
s->next
=
null;
p->next
=
s;
p
=
s;
s
=
new
node;
}
delete
s;
}
//*****************列印表************************
void
print(node*
l)
{
node*
p
=
l->next;
while(p)
{
cout<
elem<<"
";
p
=
p->next;
}
cout<
next;
p2
=
p1->next;
while(p2)
{
if(p2->elem
>
p1->elem)
{
p1
=
p2;
p2
=
p2->next;
}
else
{
p2
=
p2->next;
}
}
return
p1;
}
int
main()
{
node*
l;
initlink(l);
creatlink(l);
cout<<"鏈表為:";
print(l);
node*
p
=
searchmax(l);
cout<<"表中最大值為:";
cout<
elem<
評論
0
0
載入更多
㈩ 定義鏈表的演算法
定義列表的話,要先定義列表的節點。在亮點的節點中,至少包含一個數據域和一個鏈接域,用來指向下一個節點的地址。