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);
}