當前位置:首頁 » 編程語言 » c語言單鏈表項目總結
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言單鏈表項目總結

發布時間: 2022-12-18 08:06:44

1. 數據結構(c語言)單鏈表的問題

/*
這是結果,需要的話給我個地址
------------------------
***建立含有n個數據元素的帶頭結點的單鏈表***
請輸入n = 5
請輸入第1個元素:1
請輸入第2個元素:2
請輸入第3個元素:3
請輸入第4個元素:4
請輸入第5個元素:5
依次輸出該表中各元素的值:1 2 3 4 5
將單鏈表進行逆置運算:
依次輸出逆置後表中各元素的值:5 4 3 2 1
Press any key to continue
------------------------------
*/

2. C語言:如何用單鏈表建立一個校運動會項目管理表

初始化錄入,我就錄入3個學院做測試。你像錄入更多,自己修改初始化函數init的變數n初值就好了。
另外,我沒有寫輸入驗證,該輸入數字的地方不要輸其他無關字元。想驗證你可以在我的scanf那裡加驗證。

#include <stdio.h>

#include <string.h>

#include <malloc.h>

typedef struct race

{

char sName[50];//學院名稱

char pName[50];//項目名稱

int rank;//項目名次

struct race *next;

}RACE;

void pfList(RACE *raceHead);//列印鏈表信息

int init(RACE **raceHead,RACE **raceTail);//初始化鏈表,成功返回1,失敗返回0

int CreatList(RACE **raceHead,RACE **raceTail);//成功返回1,失敗返回0

void tjs(RACE *raceHead);//統計學院參加項目數,及所有名次為第一名的信息

void delByP(RACE *raceHead,RACE **raceTail);//根據項目刪除所有節點

int main()

{

RACE *raceHead=NULL,*raceTail=NULL;

if(!init(&raceHead,&raceTail))

{

printf("程序異常終止! ");

return 1;

}

pfList(raceHead);

tjs(raceHead);

delByP(raceHead,&raceTail);

printf("刪除後鏈表信息: ");

pfList(raceHead);

return 0;

}

int init(RACE **raceHead,RACE **raceTail)//初始化鏈表,成功返回1,失敗返回0

{

int n=3;//初始化3個學院的信息

while(n--)

if(!CreatList(raceHead,raceTail))

return 0;

return 1;

}

void pfList(RACE *raceHead)//列印鏈表信息

{

printf(" 當前鏈表信息: ");

while(raceHead->next)

{

printf("學院名:%s ",raceHead->next->sName);

printf("--項目:%s ",raceHead->next->pName);

printf("--名次:%d ",raceHead->next->rank);

raceHead=raceHead->next;

}

}

int CreatList(RACE **raceHead,RACE **raceTail)//成功返回1,失敗返回0

{

int rank;

char sname[50],pname[50];

RACE *raceNew=NULL;

if(!*raceHead)

{

*raceHead=(RACE *)malloc(sizeof(RACE));

if(!*raceHead)

return 0;

(*raceHead)->next=NULL;

}

printf("請輸入參賽的學院名稱:");

scanf("%s",sname);

printf("請輸入參加的所有項目及名次(輸入EXIT -1結束輸入): ");

while(1)

{

scanf("%s%d",pname,&rank);

if(strcmp(pname,"EXIT")==0)

break;

raceNew=(RACE *)malloc(sizeof(RACE));

if(!raceNew)return 0;

strcpy(raceNew->sName,sname);

strcpy(raceNew->pName,pname);

raceNew->rank=rank;

raceNew->next=NULL;

if(!(*raceHead)->next)

(*raceHead)->next=raceNew;

else

(*raceTail)->next=raceNew;

*raceTail=raceNew;

}

return 1;

}

void tjs(RACE *raceHead)//統計學院參加項目數,及所有名次為第一名的信息

{

int cnt=0;

char sname[50];

printf(" --統計學院參加項目數,及所有名次為第一名的信息-- 輸入要統計的學院名字:");

scanf("%s",sname);

printf("學院:%s在本次比賽中獲得第一名的項目有: ",sname);

while(raceHead->next)

{

if(strcmp(raceHead->next->sName,sname)==0)

{

if(raceHead->next->rank==1)

printf("--項目:%s ",raceHead->next->pName);

cnt++;

}

raceHead=raceHead->next;

}

printf("學院%s共參加的項目數量為: %d ",sname,cnt);

}

void delByP(RACE *raceHead,RACE **raceTail)//根據項目刪除所有節點

{

RACE *raceLast=raceHead,*raceSave=raceHead,*del=NULL;

char pname[50];

printf(" ---根據項目刪除所有節點--- 輸入要刪除的項目名稱:");

scanf("%s",pname);

while(raceHead->next)

{

if(strcmp(raceHead->next->pName,pname)==0)

{

del=raceHead->next;

raceLast->next=del->next;

free(del);

raceLast=raceSave;

raceHead=raceSave;

continue;

}

raceHead=raceLast->next;

raceLast=raceLast->next;

}

*raceTail=raceLast;

}

3. C語言:用棧來逆置一個單鏈表,哪位大神能給出下面代碼的詳細的解釋謝謝

#include <stdio.h>
#include<stdlib.h>
#define stacksize 100
typedef int datatype;//這里所謂的datatype關鍵字是不存在的,所以這里用typedef (類型定義) 定義成int 型,意思是datatype 就是int
typedef struct
{
datatype data[stacksize];
int top;
}seqstack;//這里定義了棧(其實就是結構體,裡面有個int型的數組和int型的成員),在下面有棧的一些運算,


typedef struct node
{
datatype data;
struct node *next;
}listnode;//這里定義了鏈表。int 型成員和 node * 指針



typedef listnode *linklist;//定義linklist指針,就是listnode 類型的指針
linklist h;
linklist p;
int x;


linklist creatlist(int n) //這里是創建鏈表
{
linklist h;
listnode *p1,*p2;
int i;
h=(linklist)malloc(sizeof(listnode));/*這里是為 h 這個結點(或者可稱為結構體,它本來的面目),申請內存空間,大小就是(sizeof(listnode),就是結構體所佔大小)*/


h->next=NULL; /*逆置單鏈表初始為空*/
p2=h;
printf("請輸入鏈記錄!: ");


for(i=0;i<n;i++)//這里就輸入n個記錄,比如1,2,3,4,5
{
p1=(linklist)malloc(sizeof(listnode));//同上
scanf("%d",&p1->data);//輸入該節點中的數據成員data的值
p1->next=p2->next; /*將當前處理節點p插入到逆置L的表頭*/
p2->next=p1;
p2=p1; /*p指向下一個待插入的節點*/
}
return (h);
}


void print(linklist h,int n)//將該鏈表列印出來
{
if(h==NULL)
printf("鏈表為空! ");
printf("這%d個鏈記錄是: ",n);
p=h->next;
printf("%d",p->data);
x=1;
while(p->next!=NULL)
{
x++;
p=p->next;
printf("%4d",p->data);//這里就是P指針一直指向next, 循環列印,直到p=NULL..
if(!(x%10))
printf(" ");// - -這里應該是每列印10次就換行的意思。
}
}
datatype push(seqstack *s,int x) /*這里就是棧的操作,進棧,返回類型為datatype,實際上就是int,這里說下參數,第一個參數是指向棧的指針類型,第二個參數是你要進棧的值*/
{
if(s->top==stacksize-1)//超出棧的大小
printf("堆棧溢出! ");
else
s->data[++s->top]=x;
}
datatype pop(seqstack *s) //和上面相同,這個是出棧,return 棧的元素的值
{
if(s->top==-1)
printf("堆棧為空! ");
else
return (s->data[s->top--]);
}
datatype deleted(linklist h)//刪除鏈表結點的值,並將該結點中data值放到temp
{
datatype temp;
linklist p;
p=h->next;
temp=(p->data);
h->next=p->next;
free(p);//這步重要!釋放結點所佔的空間
return (temp);
}
void invertedlist(linklist h,int n)//
{
seqstack s;
int i,j,temp;
s.top=-1;
for(i=0;i<n;i++)//說白了就是將鏈表的值依次進棧
{
temp=deleted(h);
push(&s,temp);
}
for(i=0;i<n;i++)//然後將各個值依次出棧
{
temp=pop(&s);
printf("%5d",temp);
if(!((i+1)%10))
printf(" ");
}
printf(" ");
}
main()
{
linklist h;
int n;
printf("請輸入n的值: ");
scanf("%d",&n);
h=creatlist(n);
print(h,n);
printf(" ");
printf("經過逆置,鏈記錄為: ");
invertedlist(h,n);
system("pause");
return 0;
}

最後總結,原理就是利用棧的先進後出的特性來實現逆置的。有什麼不懂可以再提問。

4. C語言的單鏈表問題,謝謝解答

單鏈表簡介
鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。

單鏈表
以"結點的序列"表示線性表稱作線性鏈表(單鏈表)

單鏈表是鏈式存取的結構,為找第 i 個數據元素,必須先找到第 i-1 個數據元素。

因此,查找第 i 個數據元素的基本操作為:移動指針,比較 j 和 i

單鏈表

1、鏈接存儲方法

鏈接方式存儲的線性表簡稱為鏈表(Linked List)。

鏈表的具體存儲表示為:

① 用一組任意的存儲單元來存放線性表的結點(這組存儲單元既可以是連續的,也可以是不連續的)

② 鏈表中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關系,在存儲每個結點值的同時,還必須存儲指示其後繼結點的地址(或位置)信息(稱為指針(pointer)或鏈(link))

注意:

鏈式存儲是最常用的存儲方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的數據結構。

2、鏈表的結點結構

┌───┬───┐

│data │next │

└───┴───┘

data域--存放結點值的數據域

next域--存放結點的直接後繼的地址(位置)的指針域(鏈域)

注意:

①鏈表通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈接在一起的。

②每個結點只有一個鏈域的鏈表稱為單鏈表(Single Linked List)。

【例】線性表(bat,cat,eat,fat,hat,jat,lat,mat)的單鏈表示如示意圖

3、頭指針head和終端結點指針域的表示

單鏈表中每個結點的存儲地址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指針head指向開始結點。

注意:

鏈表由頭指針唯一確定,單鏈表可以用頭指針的名字來命名。

終端結點無後繼,故終端結點的指針域為空,即NULL。

4、單鏈表的一般圖示法

由於我們常常只注重結點間的邏輯順序,不關心每個結點的實際位置,可以用箭頭來表示鏈域中的指針,線性表(bat,cat,fat,hat,jat,lat,mat)的單鏈表就可以表示為下圖形式。

5、單鏈表類型描述

typedef char DataType; //假設結點的數據域類型為字元

typedef struct node{ //結點類型定義

DataType data; //結點的數據域

struct node *next;//結點的指針域

}ListNode;

typedef ListNode *LinkList;

ListNode *p;

LinkList head;

注意:

①LinkList和ListNode是不同名字的同一個指針類型(命名的不同是為了概念上更明確)

②*LinkList類型的指針變數head表示它是單鏈表的頭指針

③ListNode類型的指針變數p表示它是指向某一結點的指針

6、指針變數和結點變數

指針變數
結點變數
定義
在變數說明部分顯式定義
在程序執行時,通過標准函數malloc生成
取值
非空時,存放某類型結點
實際存放結點各域內容的地址
①生成結點變數的標准函數

p=( ListNode *)malloc(sizeof(ListNode));

//函數malloc分配一個類型為ListNode的結點變數的空間,並將其首地址放入指針變數p中

②釋放結點變數空間的標准函數

free(p);//釋放p所指的結點變數空間

③結點分量的訪問

利用結點變數的名字*p訪問結點分量

方法一:(*p).data和(*p).next

方法二:p->data和p->next

④指針變數p和結點變數*p的關系

指針變數p的值--結點地址

結點變數*p的值--結點內容

(*p).data的值--p指針所指結點的data域的值

(*p).next的值--*p後繼結點的地址

*((*p).next)--*p後繼結點

注意:

① 若指針變數p的值為空(NULL),則它不指向任何結點。此時,若通過*p來訪問結點就意味著訪問一個不存在的變數,從而引起程序的錯誤。

② 有關指針類型的意義和說明方式的詳細解釋

可見,在鏈表中插入結點只需要修改指針。但同時,若要在第 i 個結點之前插入元素,修改的是第 i-1 個結點的指針。

因此,在單鏈表中第 i 個結點之前進行插入的基本操作為:

找到線性表中第i-1個結點,然後修改其指向後繼的指針。

5. c語言構建一個最簡單的單鏈表

typedef struct node { char name[20]; struct node *link; }stud; 下面就來看一個建立帶表頭(若未說明,以下所指 鏈表 均帶表頭)的單 鏈表 的完整程序。 #include <stdio.h> #include <malloc.h> /*包含動態內存分配函數的頭文件*/ #define N 10 /*N為人數*/ typedef struct node { char name[20]; struct node *link; }stud; stud * creat(int n) /*建立單 鏈表 的函數,形參n為人數*/ { stud *p,*h,*s; /* *h保存表頭結點的指針,*p指向當前結點的前一個結點,*s指向當前結點*/ int i; /*計數器*/ if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空間並檢測*/ { printf("不能分配內存空間!"); exit(0); } h->name[0]='\0'; /*把表頭結點的數據域置空*/ h->link=NULL; /*把表頭結點的鏈域置空*/ p=h; /*p指向表頭結點*/ for(i=0;i<n;i++) { if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存儲空間並檢測*/ { printf("不能分配內存空間!"); exit(0); } p->link=s; /*把s的地址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連接起來了*/ printf("請輸入第%d個人的姓名",i+1); scanf("%s",s->name); /*在當前結點s的數據域中存儲姓名*/ s->link=NULL; p=s; } return(h); } main() { int number; /*保存人數的變數*/ stud *head; /*head是保存單 鏈表 的表頭結點地址的指針*/ number=N; head=creat(number); /*把所新建的單 鏈表 表頭地址賦給head*/ } 這樣就寫好了一個可以建立包含N個人姓名的單 鏈表 了。寫動態內存分配的程序應注意,請盡量對分配是否成功進行檢測。

6. 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);

}