導航:首頁 > 編程語言 > 尾插法代碼

尾插法代碼

發布時間:2023-05-24 11:14:24

① 用C語言頭插法或尾插法建立帶頭結點的單鏈表,實現單鏈表上的插入,刪除計數,查找,修改,輸出等操作,

#include "鏈陪沖stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /* 存儲空間初始分配量 */
typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */typedef int ElemType;/* ElemType類型根據實際情棚殲況而定,這里假設為int */
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}

typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定義LinkList */

/* 初始化順序線性表 */
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
if(!(*L)) /* 存儲分配失敗 */
return ERROR;
(*L)->next=NULL; /* 指針域為空 */

return OK;}
/* 初始條件:順序線性表L已存在。操作結果:若L為空表,則返回TRUE,否則返回FALSE */
Status ListEmpty(LinkList L)
{
if(L->next)
return FALSE;
else
return TRUE;
}

/* 初始條件:順序線性表L已存在。操作結果:將L重置為空表 */
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一個結點 */
while(p) /* 沒到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /* 頭結點指針域為空 */
return OK;
}

/* 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數 */
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next; /* p指向第一個結點 */
while(p)
{
i++;
p=p->next;
}
return i;
}

/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:用e返回L中第i個數據元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; /* 聲明一結點p */
p = L->next; /* 讓p指向鏈表L的第一個結點 */
j = 1; /* j為計數器 */
while (p && j<i) /* p不為空或者計數器j還沒有等於i時,循環繼續 */
{
p = p->next; /* 讓p指向下一個結點 */
++j;
}
if ( !p || j>i )
return ERROR; /* 第i個元素不存在 */
*e = p->data; /* 取第i個元素的數據 */
return OK;
}

/* 初始條件:順序線性表L已存在 */
/* 操作結果:返回L中第亂數1個與e滿足關系的數據元素的位序。 */
/* 若這樣的數據元素不存在,則返回值為0 */
int LocateElem(LinkList L,ElemType e)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(p->data==e) /* 找到這樣的數據元素 */
return i;
p=p->next;
}

return 0;}
/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L), */
/* 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1 */
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i) /* 尋找第i個結點 */
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR; /* 第i個元素不存在 */
s = (LinkList)malloc(sizeof(Node)); /* 生成新結點(C語言標准函數) */
s->data = e;
s->next = p->next; /* 將p的後繼結點賦值給s的後繼 */
p->next = s; /* 將s賦值給p的後繼 */
return OK;
}

/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) /* 遍歷尋找第i個元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /* 第i個元素不存在 */
q = p->next;
p->next = q->next; /* 將q的後繼賦值給p的後繼 */
*e = q->data; /* 將q結點中的數據給e */
free(q); /* 讓系統回收此結點,釋放內存 */
return OK;
}

/* 初始條件:順序線性表L已存在 */
/* 操作結果:依次對L的每個數據元素輸出 */
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}

/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(頭插法) */
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0)); /* 初始化隨機數種子 */
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL; /* 先建立一個帶頭結點的單鏈表 */
for (i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); /* 生成新結點 */
p->data = rand()%100+1; /* 隨機生成100以內的數字 */
p->next = (*L)->next;
(*L)->next = p; /* 插入到表頭 */
}
}

/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time(0)); /* 初始化隨機數種子 */
*L = (LinkList)malloc(sizeof(Node)); /* L為整個線性表 */
r=*L; /* r為指向尾部的結點 */
for (i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node)); /* 生成新結點 */
p->data = rand()%100+1; /* 隨機生成100以內的數字 */
r->next=p; /* 將表尾終端結點的指針指向新結點 */
r = p; /* 將當前的新結點定義為表尾終端結點 */
}
r->next = NULL; /* 表示當前鏈表結束 */
}

int main()
{
LinkList L;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L後:ListLength(L)=%d\n",ListLength(L));
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表頭依次插入1~5後:L.data=");
ListTraverse(L);

printf("ListLength(L)=%d \n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);

i=ClearList(&L);
printf("清空L後:ListLength(L)=%d\n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);

for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10後:L.data=");
ListTraverse(L);

printf("ListLength(L)=%d \n",ListLength(L));
ListInsert(&L,1,0);
printf("在L的表頭插入0後:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));

GetElem(L,5,&e);
printf("第5個元素的值為:%d\n",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d個元素的值為%d\n",k,j);
else
printf("沒有值為%d的元素\n",j);
}

k=ListLength(L); /* k為表長 */
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e); /* 刪除第j個數據 */
if(i==ERROR)
printf("刪除第%d個數據失敗\n",j);
else
printf("刪除第%d個的元素值為:%d\n",j,e);
}
printf("依次輸出L的元素:");
ListTraverse(L);

j=5;
ListDelete(&L,j,&e); /* 刪除第5個數據 */
printf("刪除第%d個的元素值為:%d\n",j,e);

printf("依次輸出L的元素:"); ListTraverse(L);
i=ClearList(&L);
printf("\n清空L後:ListLength(L)=%d\n",ListLength(L));
CreateListHead(&L,20);
printf("整體創建L的元素(頭插法):");
ListTraverse(L);

i=ClearList(&L);
printf("\n刪除L後:ListLength(L)=%d\n",ListLength(L));
CreateListTail(&L,20);
printf("整體創建L的元素(尾插法):");
ListTraverse(L);

return 0;
}

② c語言單鏈表尾插法代碼

newnode->next = NULL
改為:p=newnode;
p->next = NULL;

③ 為什麼鏈表的第一個結點沒有數據呢我用的是不含頭結點的尾插法,代碼如下:

你這個head就是頭結點啊,初始化以後並沒有插入數據,通過p將head的族賣next指向s,不斷創建兆跡逗新節點s賦值,head作為第一個結點州棗並沒有數據

④ 尾插法 C/C++

//要先判斷rear是否為空.
//你的原程序中在插入數的時候,沒設置head,所以head一直為null,則while循環p的值初始就為null,所以不會有任何輸出。況且運行的話會出現運行時錯誤,因為rear的初值為null,i=1的時候,rear=null,這時候調用rear->next程序會報錯退出,所以應該先判斷rear是否為空,即判斷表中是否有元素,沒有元素的話,就應該將第一個插入的元素設察察缺敗辯為rear,同時也要設為head。head=rear=p表示head = p; rear = p;第二次插入的沒帆時候head仍然指向頭元素,rear指向新元素。判斷使用head和rear效果是一樣的。
struct增加一個構造函數,for循環的邏輯改了一下
#include <iostream>
using namespace std;
struct inode
{
inode(int i) : data(i), next(null) {}
int data;
inode*next;
};

int main()
{
int m=8, n = 4;
inode *head = NULL, *rear = NULL;

for(int i=1;i<=n;i++)
{
inode *p = new inode(i);
(rear == NULL ? head : rear->next) = p;
rear=p;
}

inode *p = head ;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}

return 0;
}

⑤ 求解C語言中尾插法建立鏈表的原理

沒看懂你的代碼,但尾插法的原理是很簡單的,它就是兩句話:
設r初始時困判指向頭結點
設n為要輸入結點的個數
下面是偽代碼:
while(n>0)
{
p=動態為p分配內存
p->data=為當前結點賦值
r->歷啟next=p 令r的指針域指向新結點p
r=p;// 令r指向新結汪爛改點的地址(方便下一次的結點繼續成為r的後繼,反復如此......直至n不大於0)
n--
}

它的核心就兩句話 r->next=p和r=p
如果你依然未懂的話,你就拿一張白紙,拿只筆,在紙上模擬上面那兩句話。相信你肯定會懂的。

⑥ 尾插法單鏈表有兩行代碼不懂,能解釋下嗎謝謝~

每新激仔建一明春汪個節點,r就往後挪一個森老

⑦ 鏈表尾插法函數的問題(在代碼中)

L->next=NULL;
這句話的作用是把尾節點的指針域賦值為0.
鏈表的遍歷判斷是否遍歷的最後一個迅枯襪節點的方法就是判斷該節點的指針域是敗派否為0.
這里的L指向的就是鏈表的尾節點,所以它的指針域必須得賦值為0,不然遍歷的時候就會出問題。
其實代碼可以改一下,改畝激成
for (int i=0;i<10;i++)
{
s=(List*)malloc(sizeof(List));
s->data=i;
s->next=NULL; //有了這句代碼,L->next=NULL;這句代碼就可以不要了,這樣是不是更好理解一點
L->next=s;
L=s;
}
//L->next=NULL;//此處是什麼意思???????望詳解

⑧ C++尾插法

voidlinklist::additem(intd)
{
link*p,*q;
p=point;
while(p->next!=NULL)
p=p->褲逗next;//找到尾結點
q=newlink;
q->data=d;
q->next=NULL;//以洞純雀上納早完成新結點的建立

p->next=q;//把新結點追加到原表尾
p=q;//q成為新的尾結點
}

閱讀全文

與尾插法代碼相關的資料

熱點內容
不用網路載入的單機游戲有哪些 瀏覽:608
數據線插頭怎麼接頭 瀏覽:577
網路載入視頻失敗是怎麼回事 瀏覽:805
傳奇賬號在哪個文件夾里 瀏覽:346
百度app在哪裡安裝 瀏覽:587
如何設置路由器網路不斷網 瀏覽:471
傳到qq群里的文件怎麼刪除 瀏覽:861
索尼安卓71更新日誌 瀏覽:234
怎麼找手機里的垃圾app 瀏覽:540
2015藍橋杯代碼填空 瀏覽:698
安卓資料庫dbexecSQL 瀏覽:227
doc重命名文件格式 瀏覽:728
getscreen截圖工具下載 瀏覽:719
共識數據是什麼時候開始的 瀏覽:96
數碼管顯示電壓程序 瀏覽:479
資料庫文件有哪個 瀏覽:543
途強儲存在哪個文件夾 瀏覽:172
如何恢復被覆蓋文件 瀏覽:611
iphone5用哪個版本最好 瀏覽:327
extjsgrid禁用 瀏覽:426

友情鏈接