當前位置:首頁 » 編程語言 » 線性鏈表c語言

線性鏈表c語言

發布時間: 2024-10-18 11:09:17

1. 用c語言編寫建立一個從表尾到表頭逆向單鏈線性表且進行插入 刪除的程序

#include<iostream>
using
namespace
std;
struct
Linklist
{
int
data;
Linklist
*next;
};
Linklist
*L,*rear;
void
create()//尾插法建立鏈表
{
Linklist
*p;
int
x;
cout<<"輸入鏈表元素(按升序順序輸入):"
while(cin>>x&&x!=0)
{
if(L==NULL)
{
L=new
Linklist;
L->data=x;
rear=L;
L->next=NULL;
}
else
{
p=new
Linklist;
p->data=x;
rear->next=p;
p->next=NULL;
rear=p;
}
}
rear->next=NULL;
}
void
del(int
x)//刪除data域值為x的結點
{
Linklist
*p,*k,*t;
k=p=L;
while(p!=NULL)
{
if(p->data==x)
break;
k=p;
p=p->next;
}
if(p==L)
{
p=L;
L=L->next;
delete
p;
}
else
if(p==rear)
{
k->next=NULL;
delete
p;
}
else
if(p==NULL)
{
cout<<"沒有值為"<<x<<"的結點
"<<endl;
}
else
{
k->next=p->next;
delete
p;
}
}
void
insert(int
x)//插入data域值為x的結點(默認原鏈表為升序排列)
{
Linklist
*s,*p,*k;
s=new
Linklist;
s->data=x;
s->next=NULL;
k=p=L;
while(p!=NULL)
{
if(p->data>=x)
break;
k=p;
p=p->next;
}
if(p==L)
{
L=s;
s->next=p;
}
else
if(p==NULL)
{
k->next=s;
}
else
{
k->next=s;
s->next=p;
}
}
void
output()//將鏈表輸出
{
Linklist
*p;
p=L;
cout<<"鏈表中的元素為:";
while(p!=NULL)
{
cout<<p->data<<"
";
p=p->next;
}
cout<<endl<<endl;
}
void
LinkListDemo()
{
//
L是無頭結點的單鏈表
Linklist
*q,
*p,*t;//p指針用於指示原鏈表最後的結點(即an),q指針用於指示原來的頭結點(即a1)
q=L;
if
(
q
&&
q->next
)
{
t=q;//將q指針指向a1
L=L->next;//將L指針指向新鏈表的頭結點(即a2)
rear->next=q;
q->next=NULL;
t=NULL;
}
}
void
main()
{
create();
output();
int
x;
cout<<"輸入需要插入的元素:";
cin>>x;
insert(x);
output();
cout<<"輸入需要刪除的元素:";
cin>>x;
del(x);
output();
LinkListDemo();
output();
}

2. 怎樣創建一個線性鏈表(C語言)

/*線性鏈表的構建*/
#include<stdio.h>
#include<stdlib.h>

typedefstructLnode
{
intdata;
structLnode*next;
}Lnode;

intmain()
{
Lnode*H,*p1,*p2,*p3,*p4;
H=(Lnode*)malloc(sizeof(Lnode));
p1=(Lnode*)malloc(sizeof(Lnode));
p2=(Lnode*)malloc(sizeof(Lnode));
p3=(Lnode*)malloc(sizeof(Lnode));
p4=(Lnode*)malloc(sizeof(Lnode));

p1->data=132;
p1->next=p2;
p2->data=942;
p2->next=p3;
p3->data=158;
p3->next=182;
p4->data=231;
p4->next=NULL;

printf("%d,%d ",p1->data,p3->data);
printf("%d",p1->next->data);

return0;
}

3. C語言中鏈表與隊列有什麼區別

C語言的鏈表與隊列是兩種不同的概念:

鏈表是一種數據的存儲方式,其保存的數據在內存中是不連續的,採用指針對數據進行訪問
隊列是一種數據結構,其特點是先進先出,後進後出;

隊列的存儲方式可以使用線性表進行存儲,也可以使用鏈表進行存儲。

SQQUEUE的第一個元素elemtype
*elem;其實是指向了一個數組,該數組中存儲著類型為elemtype的元素,然後front和rear就標識了隊首和隊尾元素對應的數組下標。

typedef
struct _Point{
int x,y;
}Point;
#defineelemtype
Point//這個elemtype可以是任意你自己定義的結構,可以是結構體,也可以是簡單數據類型
elemtype
array[10]={0};//這個是隊列的數據結構,在這里是一個Point數組
SQQUEUE
queue={0};
queue.elem=array;//這樣array中的元素就是queue中的元素了。
queue.front=queue.rear=queue.size=0;


4. 用C語言編寫鏈式存儲結構下實現線性表的創建,插入,刪除,按值查找

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
int data; //鏈表數據
struct LNode* next; //鏈表指針
}LNode,*LinkList;

/*頭插法-建立單鏈表*/
LinkList HeadCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode)); //建立頭結點
la->next=NULL;
scanf("%d",&num);
while(num!=10)
{
LNode *p=(LinkList)malloc(sizeof(LNode));
p->data=num;
p->next=la->next;
la->next=p;
scanf("%d",&num);
}
return la;
}

/*尾插法-建立單鏈表*/
LinkList TailCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
LinkList s,r=la;
scanf("%d",&num);
while(num!=10)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=num;
r->next=s;
r=s;
scanf("%d",num);
}
r->next=NULL;
return la;
}

/*單鏈表遍歷*/
void TravelList(LinkList la)
{
LinkList p=la->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("\n");
}

/*單鏈表的按位查找*/
LinkList GetElem(LinkList la,int i)
{
int j=1;
LNode* p=la->next;
if(i<1)
return NULL;
while(p && j<i)
{
p=p->next;
j++;
}
return p;
}

/*單鏈表的按值查找*/
LinkList LocalElem(LinkList la,int e)
{
LNode* p=la->next;
while(p!=NULL && p->data!=e)
p=p->next;
return p;
}

/*單鏈表插入操作*/
bool InsertList(LinkList la,int i,int e)
{
//在la鏈表中的i位置插入數值e
int j=1;
LinkList p=la,s;
while(p && j<i)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if((s=(LinkList)malloc(sizeof(LNode)))==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}

/*單鏈表刪除操作*/
bool DeleteList(LinkList la,int i)
{
int j=1;
LinkList p=la,q;
while(p && j<i) //p指向第i-1個元素
{
p=p->next;
j++;
}
if(p==NULL || p->next==NULL) //表示不存在第i-1個和第i的元素
return false;
q=p->next;
p->next=q->next;
free(q);
return true;
}

/*單鏈表的表長*/
int LengthList(LinkList la)
{
int nLen=0;
LinkList p=la->next;
while(p)
{
p=p->next;
nLen++;
}
return nLen;
}

/*單鏈表逆置*/
LinkList Reserve(LinkList la)
{
if(la==NULL || la->next==NULL)
return la;
LinkList p=la->next,q=p->next,r=q->next;
la->next=NULL;
p->next=NULL;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
la->next=q;
return la;
}

int main()
{
LNode la;
LinkList p;
p=HeadCreate(&la); //頭插法創建單鏈表
TravelList(p);
printf("%p\n",GetElem(p,1)); //獲得第1個結點地址
InsertList(p,2,10); //在鏈表的第2個位置插入元素10
TravelList(p);
DeleteList(p,3); //刪除鏈表的第3個元素
TravelList(p);
printf("%d\n",LengthList(p)); //獲得鏈表長度
p=Reserve(p);
TravelList(p);
return 0;
}

//運行結果
//5 6 12 7 8 14 9 3 2 5 14 10 頭插法創建鏈表
//14->5->2->3->9->14->8->7->12->6->5-> 顯示鏈表
//00382490 第一個結點的地址
//14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值為10的結點
//14->10->2->3->9->14->8->7->12->6->5-> 刪除第三個結點
//11 獲得鏈表長度
//5->6->12->7->8->14->9->3->2->10->14-> 鏈表逆置
//Press any key to continue

這是我寫的一個線性表鏈式存儲的綜合程序,包含了你所要的創建、刪除、插入、按值查找的功能,還有一些額外的功能。下面加註釋的是程序運行結果,你可以參考試著改改程序,讓程序更加完美。希望對你有幫助,呵呵!

5. 在C語言中,什麼是鏈表呀

鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,操作復雜。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間復雜度分別是O(logn)和O(1)。
使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。鏈表可以在多種編程語言中實現。像Lisp和Scheme這樣的語言的內建數據類型中就包含了鏈表的存取和操作。程序語言或面向對象語言,如C,C++和Java依靠易變工具來生成鏈表。

6. C語言,創建一個鏈表並賦值1、2、3、4、5,麻煩把全部程序寫下

// DLink.cpp : 定義控制台應用程序的入口點。

//

#include "stdafx.h"

#include "malloc.h"

typedef struct LNode

{

int data;

struct LNode *next;

}Dlink;

int _tmain(int argc, _TCHAR* argv[])

{

Dlink *l,*s1;

Dlink *s=(Dlink *)malloc(sizeof(Dlink));

l=s;

for(int i=0;i<5;i++)

{

s->data=i+1;

s1=(Dlink *)malloc(sizeof(Dlink));

s->next=s1;

s=s1;

}

s->next=NULL;

//數據就保存到以l為頭結點的鏈表中了

return 0;

}

(6)線性鏈表c語言擴展閱讀:

對於非線性的鏈表,可以參見相關的其他數據結構碧宴,例如樹、圖。另外有一種基於多個線性鏈表的數據結構:跳錶,插入、刪除和查找等基本操作的速度可以達到O(nlogn),和伏改平衡二叉樹一樣。

其中存儲數據元素信息的域稱作數悔廳銀據域(設域名為data),存儲直接後繼存儲位置的域稱為指針域(設域名為next)。指針域中存儲的信息又稱做指針或鏈。

由分別表示,,?,的N 個結點依次相鏈構成的鏈表,稱為線性表的鏈式存儲表示,由於此類鏈表的每個結點中只包含一個指針域,故又稱單鏈表或線性鏈表。

熱點內容
android發送at指令 發布:2024-10-18 13:14:18 瀏覽:658
安卓手機哪個工藝最好 發布:2024-10-18 13:01:43 瀏覽:282
源程序編譯過程中裝配器 發布:2024-10-18 13:01:43 瀏覽:117
如何查詢伺服器的序列號 發布:2024-10-18 12:57:04 瀏覽:669
鑽石腳本 發布:2024-10-18 12:56:59 瀏覽:851
用命令創建資料庫 發布:2024-10-18 12:56:01 瀏覽:529
sqlserver2008維護 發布:2024-10-18 12:54:44 瀏覽:78
全款查封帶大本未解壓 發布:2024-10-18 12:51:34 瀏覽:943
安卓機如何使用蘋果的流量 發布:2024-10-18 12:51:24 瀏覽:934
中國電腦伺服器的發展 發布:2024-10-18 12:31:38 瀏覽:777