建鏈表演算法
❶ 從表頭插入節點建立單鏈表的演算法如何寫
何在指針q指向的結點後面插入結點。該過程的步驟如下:
(1)先創建一個新結點,並用指針p指向該結點。
(2)將q指向的結點的next域的值(即q的後繼結點的指針)賦值給p指向結點的next域。
(3)將p的值賦值給q的next域。
通過以上3步就可以實現在鏈表中由指針q指向的結點後面插入p所指向的結點。可以通過圖1-5形象地展示出這一過程。
圖1-5 向鏈表插入結點過程
下面給出代碼描述:
1.void insertList(LinkList *list,LinkList q,ElemType e) /*當鏈表為空時*/ 10. else 16.} 上面的這段代碼描述了如何在指針q指向的結點後面插入結點的過程。其過程包括以下幾步。
(1)首先生成一個新的結點,大小為sizeof(LNode),用LinkList類型的變數p指向該結點。將該結點的數據域賦值為e。
(2)接下來判斷鏈表是否為空。如果鏈表為空,則將p賦值給list,p的next域的值置為空。否則,將q指向的結點的next域的值賦值給p指向結點的next域,這樣p指向的結點就與q指向結點的下一個結點連接到了一起。
(3)然後再將p的值賦值給q所指結點的next域,這樣就將p指向的結點插入到了指針q指向結點的後面。
其實通過上面這段演算法描述可以看出,應用這個演算法同樣可以創建一個鏈表。這是因為當最開始時鏈表為空,即list==NULL,該演算法可自動為鏈表創建一個結點。在下面的創建其他結點的過程中,只要始終將指針q指向鏈表的最後一個結點,就可以創建出一個 鏈表。
注意:函數insertList()的參數中有一個LinkList *list,它是指向LinkList類型的指針變數,相當於指向LNode類型的指針的指針。這是因為在函數中要對list,也就是表頭指針進行修改,而調用該函數時,實參是&list,而不是list。因此必須採取指針參數傳遞的辦法,否則無法在被調函數中修改主函數中定義的變數的內容。以下的代碼也有類似的情況。
❷ c語言如何創建單鏈表
C語言創建單鏈表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("請輸入第1個數據:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("請輸入第%d個數據:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("鏈表創建成功!");
}
void main()
{
int n;
printf("請你輸入鏈表的個數:");
scanf("%d",&n);
create(n);
}
❸ C語言 頭插法的鏈表該如何建立 演算法是什麼 麻煩各位兄弟講一下 小弟實在理解不了
鏈表其實很簡單,很容易理解的,只要把它當做循環理解就好了,只不過是一個較為特殊的循環,不要把它想像的太難
首先結構體知道吧,知道就好辦,不知道就趕緊復習一下,只有吃透了結構體,才能明白鏈表,不然鏈表沒法講
首先定義全局變數 結構體(鏈表結點的結構體類型,也可以簡單的理解所謂結點就是指這個結構體)
案例:輸入學生名字和編號
#include "stdio.h"
struct person
{
char *name;
int numbers;
struct person *next;
};
//指針*next起連接作用,是結點和下一個結點的橋梁,必不可少!
在定義 主程序
main()
{
struct person *head,*p1,*p2;
//定義鏈表操作時的三個指針,*head為頭指針;*p1為申請下一個結構體的內存空間(即新的結點),用於存放新的數據;*p2為保存*p1所申請的內存空間(即保存新結點),也就是保存p1中的數據;三個指針缺一不可!
p1=p2=(struct person *)malloc(size);
head=p1;
//malloc函數申請第一個結點,讓p1、p2、head共同指向同一個內存空間(即申請的第一個結點)
scanf("%s%d",p1->name,&(p1->numbers));
//向申請的第一個結點輸入數據
//下來就該進入循環了
while(p1->numbers !=0)
{
p2=p1;
p2->next=p1;
p1=( struct person *)malloc(size);
scanf("%s%d",p1->name,&(p1->numbers));
}
p2->next=NULL;
//此時就進入了鏈表的核心演算法,得給你好好講講!
//循環的判斷條件是學生的編號(numbers)不等於0,首先判斷第一個結點輸入的學生編號是否為0
1.當不為0時,執行循環當中的內容
首先,讓p2保存p1申請的結點(即p2=p1)
然後讓p2中的next指向p1(即p2->next=p1),在讓p1去開辟下個結點
然後用malloc函數申請下一個結點,也就是p1開辟新結點(即p1=(struct person *)malloc(size));在這個新開辟的結點輸入數據(即scanf("%s%d",p1->name,&(p1->numbers)));
接著就又進入循環判斷條件,滿足條件繼續進入循環語句,不滿足則進入語句2
注意p1、p2、head都指向第一個結點,其中head保存第一個結點,而p1、p2都是相互配合變化的,即p1開辟新結點,p2保存p1開辟的結點,如果循環幾次,你就可以發現他們的規律了,
2.當學生編號(numbers)等於0時,退出循環
執行p2->next=NULL;其意思是停止p1開辟新結點(在循環語句里next是指向p1,讓p1去開辟新結點)
}
如果你能看懂以上內容,那麼鏈表的輸入和鏈表的刪除、插入應該也就很容易明白,若有別的問題QQ留言121590680
如果對你有所幫助,請記得採納最佳答案,謝謝!
❹ 請教關於尾插法建立單鏈表的演算法
tailing是通過在列表尾部逐個插入新節點來創建列表。與前面的插值一樣,每次應用新節點時,都會讀入相應的數據元素值。不同之處在於,為了將新節點插入表的尾部,需要添加尾部指針r來指向鏈表的尾部。
[演算法步驟]
創建一個只有頭節點的空鏈表。
②尾部指針R的初始化,指向頭部節點。
③根據鏈表創建中包含的元素n的個數,進行n個循環的以下操作:
生成新節點*p;
●將輸入元素值賦給新節點*p的數據欄位;
●在尾節點*R後插入新節點*P;
●尾部指針R指向新尾部節點*PS
如圖所示,線性表(A、B、C、D、E)後插值的創建過程與線性表相同。
【演算法描述】
voidCreatelist_R(Linklist&L,intn) //正位序輸入n個元素的值,建立帶表頭結點的單鏈表L個人
{
L=newLNode; //先建立一個帶頭結點的空鏈表L->next=NULL; //尾指針指向頭結點r=L;
for(i=0;i<n:++i) //生成新
{
p=newLNode; //輸入元素值賦給新結點p的數據域cin>>p->data; //將新*p插入尾結點*r之後p->next=NULL;r->next=p;
r=p; //r指向新的尾結點*p
}
}
演算法時間復雜度為O(n)。
(4)建鏈表演算法擴展閱讀:
尾部插入方法從空表開始,重復讀取數據,生成新節點,將讀取的數據存儲在新節點的數據欄位中,然後將新節點插入到當前鏈表的尾部,直到讀取標記結束。從空表開始,重復讀取數據,生成新節點,將讀取的數據存儲在新節點的數據欄位中,然後將新節點插入到當前鏈表的末尾,直到讀取標志結束。
❺ 頭插法建立單鏈表的演算法
void creatlist(Linklist &l)
{
Linklist p,q;
l=(Linklist)malloc(sizeof(LNode));
l->next=NULL;
p=l;
while(1)
{
q=(Linklist)malloc(sizeof(LNode));
q->next=NULL;
scanf("%d",&q->data);
if(q->data<0)
break;
p->next=q;
p=q;
}
}
http://blog.csdn.net/peerslee/article/details/49451277
這個鏈表建立時用的就是頭插法,希望幫到你,希望採納
❻ 寫出按正序建立一個單鏈表的演算法。
就是尾插法創建單鏈表吧
LNode *create_LinkList(void)
/* 尾插入法創建單鏈表,鏈表的頭結點head作為返回值 */
{ int data ;
LNode *head, *p, *q;
head=p=(LNode *)malloc(sizeof(LNode));
p->next=NULL; /* 創建單鏈表的表頭結點head */
while (1)
{ scanf(「%d」,& data);
if (data==32767) break ;
q= (LNode *)malloc(sizeof(LNode));
q–>data=data; /* 數據域賦值 */
q–>next=p–>next; p–>next=q; p=q ; /*鉤鏈,新創建的結點總是作為最後一個結點*/
}
return (head);
}
❼ 鏈表演算法設計
我現在在別人電腦上,沒有編譯器,沒法測試,先寫了第1個程序。等明天在自己電腦上再寫第2個吧。
1.
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
LNode *R=NULL;
void Insert(int e)
{
LNode *temp=(LNode *)malloc(sizeof(LNode));
temp->data=e;
if(R==NULL)
{
R=temp;
temp->next=R;
}
else
{
temp->next=R->next;
R->next=temp;
R=temp;
}
}
void print()
{
if(R!=NULL)
{
LNode *p=R;
do
{
p=p->next;
printf("%d ",p->data);
}while(p!=R);
}
}
void DeletePreR()
{
if(R!=NULL)
{
if(R->next==R)
{
free(R);
R=NULL;
}
else
{
LNode *p=R->next,*q;
while(p->next->next!=R)
p=p->next;
q=p->next;
p->next=q->next;
free(q);
}
}
}
void main()
{
int a;
scanf("%d',&a);
while(a!=0)
{
Insert(a);
scanf("%d",&a);
}
print();
DeletePreR();
print();
}
❽ c語言採用頭插法或尾插法建立鏈表,從鍵盤輸入遞增有序的數據建立 鏈表
void DeleteRepetedNode(PNode head)
{
int a[100]={0};
int i = 0,j;
int flag = 1;
PNode p,q,pre;
pre = head;
p = pre->next;
q = p->next;
while(p)
{
a[i++] = pre->data;
for(j=0;j<i;j++)
if(a[j]==p->data)
{
pre->next = q;
free(p);
p = q;
flag = 0;
break;
}
if(flag)
pre = p;
if(q&&p)
{
p = q;
q = q->next;
}
flag = 1;
}
}
❾ 編寫鏈表演算法
node *newhead;
p=head->next;
q=head;
newhead=head;
while(p!=NULL)
{
if(p->data<head->data)
{
q->next=p->next;
p->next=newhead;
newhead=p;
p=q->next;
}
else
{
q=q->next;
p=p->next;
}
}
return newhead;
直接寫的 沒在程序里試 你試試看行不行
❿ 如何用C語言創建一個鏈表,實現增、刪、改、查
#include<stdio.h>
#include<string.h>
#include <malloc.h>
//先定義一種student類型,表示一個學生的信息,如下:
typedef struct student
{
int num; //表示學號
char name[30]; //表示姓名
float score; //表示分數
}student;
//定義一種NODE類型,表示一個結點信息,如下:
typedef struct node
{
student st; //表示一個學生的信息
struct node *next; //表示一個NODE類型的指針
}NODE;
//1、寫出建立一個帶頭結點的線性鏈表的函數,其中每個結點包括學號、姓名、分數三個數據域。函數形式如下:
NODE *creat_link(int direction)
{
NODE *head,*p,*tail;
int xh,i=1;
if(direction==1) //當direction的值為1時,新建立的結點連到尾部
{
tail=head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
while(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢
{
p=(NODE *)malloc(sizeof(NODE));
p->st.num=xh;
printf("請輸入第%d個學生的姓名:",i);
scanf("%s",p->st.name);
printf("請輸入第%d個學生的成績:",i);
scanf("%f",&p->st.score);
p->next=NULL;
tail->next=p;
tail=p;
i=i+1;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
}
}
else if(direction==0) //當direction為0時,新建立的結點成為第一個結點
{
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
while(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢
{
p=(NODE *)malloc(sizeof(NODE));
p->st.num=xh;
printf("請輸入第%d個學生的姓名:",i);
scanf("%s",p->st.name);
printf("請輸入第%d個學生的成績:",i);
scanf("%f",&p->st.score);
p->next=head->next;
head->next=p;
i=i+1;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
}
}
return head;
}
//2、寫出輸出上述鏈表各結點數據域值的函數。該函數對應的函數需要一個形參,表示鏈表的頭指針,形式如下:
void print_link(NODE *head)
{
NODE *p;
p=head->next;
printf("%-10s%-20s%-10s\n","學號","姓名","分數");
while(p!=NULL)
{
printf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);
p=p->next;
}
//該函數能輸出head所指的鏈表的所有結點值,輸出形式如下:
/*本函數輸出線性表sq中所有數據,形式如下:
學號 姓名 分數
12 張三 234.5
18 李四 987.7
……… ……… …….*/
}
//3、寫出在鏈表中刪除結點的函數
int del_link(NODE *head,char name[])
{
NODE *p,*p1;
p=head->next;
p1=head;
while(p!=NULL)
{
if(strcmp(p->st.name,name)!=0)
{
p1=p;
p=p->next;
}
else
{
break;
}
}
if(p!=NULL)
{
p1->next=p->next;
free(p);
return 1;
}
else
{
return 0;
}
//刪除head所指的鏈表中,名字為name的結點,刪除成功返回1,不成功返回0
}
//4、寫出在鏈表中插入結點的演算法
int insert(NODE *head,student x,int wz)
{
NODE *p=head;
int i=0,jg;
if(wz<=0)
{
jg=0;
}
else
{
while(i<wz-1&&p!=NULL)
{
i++;
p=p->next;
}
if(p==NULL)
{
jg=0;
}
if(i=wz-1)
{
//找到wz前面的節點,p指向它
NODE *q;
q=(NODE *)malloc(sizeof(NODE));
q->st.num=x.num;
strcpy(q->st.name,x.name);
q->st.score=x.score;
q->next=p->next;
p->next=q;
jg=1;
}
}
return jg;
//該函數能夠在wz這個結點之前,插入一個新結點,新結點的數據域為x。插入成功返回1,不成功返回0。
}
//5、寫出主函數,分別調用上面演算法所對應的程序,建立鏈表,並輸出鏈表的值。
void main()
{
NODE *head; //定義指針變數head
int wz; //表示插入位置
char xm[30];
student st; //定義一個變數st,用來表示一個學生的信息
head=creat_link(1);
print_link(head); //調用函數建立鏈表,並把返回值送給head;
//調用函數,輸出鏈表中各個結點的值
//輸入一個學生的有關信息,送給變數st的有關成員
printf("\n\n請輸入要插入的位置:");
scanf("%d",&wz); //輸入wz的值
printf("請輸入要插入的學生的學號:");
scanf("%d",&st.num);
printf("請輸入要插入的學生的姓名:");
scanf("%s",st.name);
printf("請輸入要插入的學生的成績:");
scanf("%f",&st.score);
//調用函數,在鏈表中把學生st的值作為一個結點插入,如果插入成功,輸出新鏈表
if(insert(head,st,wz)==1)
{
printf("\n插入成功,新表為:\n");
print_link(head);
}
else
{
printf("插入不成功");
}
//調用函數,在鏈表中刪除一個指定結點的值,如果刪除成功,輸出新鏈表
printf("\n\n請輸入要刪除的學生的姓名:");
getchar();
gets(xm);
if(del_link(head,xm)==1)
{
printf("\n刪除成功,新表為:\n");
print_link(head);
}
else
{
printf("刪除不成功");
}
}