① 怎麼用c++建立單循環鏈表
#include <iostream.h>
#include <蠢伍stdio.h>
#include <stdlib.h>
typedef struct node
{
int date;
struct node *next;
}slnode,*Linklist;
void creat_list(Linklist H)//創建鏈表,由於實參傳值使L指向了一個空節點從而成為頭節點指針
{
Linklist p, p1;
int n;
cout<<"請輸入結點數"<<endl;
cin>>n;
H->date=n;
cout<<"請輸入結點數據"<<endl;
p1 = H;//使p1具有了空間
for(int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(slnode));
p->next = NULL;
cin>>p->date;
H->next = p;
H=p;//L指向了最後節點的數據域
};
H=p1;//使尾指針指向了最後節點的數據域
}
void display_list(Linklist H)//輸出鏈表
{
cout<<"輸出"<<endl;
Linklist p;
p = H-> next;
for(int i=0;i<H->date;i++)
{
cout<<p->date;
cout <<缺檔皮 ' ';cout<<' ';
p = p -> next;伏差
}
}
void main()
{
slnode a;//a是空結構變數
Linklist p;//p是指針
p = &a;//p指向了一個空節點
creat_list(p);//傳的是結構變數的地址
display_list(p);
}
② 如何用c語言編寫一個鏈表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//數據域
struct Node * next;//指針域
};
/*************************************************************************************
*函數名稱:Create
*函數功能:創建鏈表.
*輸入:各節點的data
*返回值:指針head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函數名稱:insert
*函數功能:在鏈表中插入元素.
*輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容
*返回值:無
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函數名稱:del
*函數功能:刪除鏈表中的元素
*輸入:head 鏈表頭指針,p 被刪除元素位置
*返回值:被刪除元素中的數據域.如果刪除失敗返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函數名稱:print
*函數功能:列印鏈表中的元素
*輸入:head 鏈表頭指針
*返回值:無
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函數名稱:main
*函數功能:主函數創建鏈表並列印鏈表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
③ C語言建立循環鏈表
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct list
{
int num;
struct list *next;
}List;
int n=0;
List *creat()
{
List *head,*p1,*p2;
int i;
if((head=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
p1=p2=head;
printf("輸入創建鏈表的長度:");
scanf("%d",&head->num);//創建列表,帶頭結點,頭結點數據域表示輸入的個數
if(head->num==0)
{
head->next=NULL;
printf("已創建帶頭結點的空鏈表");
}
else
{
printf("輸入數據:\n");
for(i=0;i<head->num;i++)
{
if((p1=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
scanf("%d",&p1->num);
p2->next=p1;
p2=p1;
}
p1->next=head;
}
return(head);
}
void print(List *head)
{
List *p;
p=head->next;
for(;p!=head;)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
void main()
{
List *head;
head=creat();
print(head);
}
④ 關於C語言版數據結構中的單循環鏈表
void showlist(linklist head){//遍歷輸出鏈表
listnode *p;
p=head;
if(p->next=head){//這行里的p->next=head應寫成p->next==head
printf("list is empty!\n");
return;
}
else{
while((p=p->next)!=head){
printf("%d ",p->data);
}
}
}
⑤ 如何創建一個空的c語言雙向循環鏈表
只是雙向給你參考... 加個循環對你應該問題不大吧...
⑥ 線性表 單向循環鏈表的操作(C語言)
這是將數模昌據寫入鏈表 你的程序比較亂而且旦御扒沒有注釋改拆櫻起來比較費勁,
你第二個函數的功能是計算一個節點數據中字元串的長度還是計算鏈表中元素的個數?表達不明確!
SLNode *LinkedListInit()
{
int N
LinkedList L;
L=(LinkedList)malloc(sizeof (SLNode));
do{
printf("Please Enter Data:");
scanf("%d",&L->data);//添加數據到鏈表
L->next=L;
printf("停止輸入數據請按0繼續請按1!");
printf("Enter:");
scanf("%d",&N);
}while(N!=0);
return L;
}
⑦ 【懸賞】C語言,數據結構,循環鏈表問題!
1、指針指向一個結點是指棗行悶利用此指針可以直接訪問這個結點,包括這帶虧個結點的data和next所以指針指向最後一個結點,代表這個指針是最後一個結點的地址
2、循環鏈表是最後一個結點的next域指向頭結點,上面的方法是尾插法建鏈表,新建的結點插在表尾,即為最後一個結點,所以每建一個,其next域就應修改為head
3、//La和Lb是兩個僅設尾凳彎指針的循環鏈表
//將Lb合並到La的表尾,由La指示新表
void MergeList(LinkList * La,LinkList Lb)
{
LinkList p = Lb->next;
Lb->next = (* La)->next;
(* La)->next = p->next;
free(p);
(* La) = Lb;
}
⑧ 用C語言編寫一個程序,建立雙向循環鏈表,並實現它的插入操作、刪除操作
望笑納~
//CreateList_L.cpp
//To create a LinkList
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0
# define INFEASIBLE -1
# define OVERFLOW -2
typedef struct DuLNode
{ int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
// 初始條件:L已存在。操作結果:返回L中數據元素個數
int ListLength(DuLinkList L)
{
int i=0;
DuLinkList p=L->next; // p指向第一個結點
while(p!=L) // p沒到表頭
{
i++;
p=p->next;
}
return i;
}
// 由雙鏈循環線性表L的頭結點出發,正序輸出每個數據元素
void ListTraverse(DuLinkList L)
{
DuLinkList p=L->next;
while(p!=L)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
// 由雙鏈循環線性表L的頭結點出發,逆序輸出每個數據元素
void ListTraverseBack(DuLinkList L)
{
DuLinkList p=L->prior;
while(p!=L)
{
cout<<p->data<<"\t";
p=p->prior;
}
cout<<endl;
}
//To Creatre a DuLinkList L with HeadNode
void CreateList_DuL(DuLinkList &L)
{
int n;
int i;
DuLNode *p;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->next=L->prior=L;
cout<<"CreateList_L"<<endl<<"================"<<endl;
cout<<"Please input the Init DuLinkNode Number: <eg. 5> ";
cin>>n;
cout<<"Please input the data for DuLinkList Nodes: <eg. 34,67,3,-9,45,...>"<<endl;
for(i=n;i>0;--i)
{
p=(DuLinkList)malloc(sizeof(DuLNode));
cin>>p->data; //Reverse order inputing for Creating a LinkList
p->prior=L;
p->next=L->next;
L->next->prior=p;
L->next=p;
}
if(n)
{
cout<<endl;
cout<<"Success to Create a DuLinkList !"<<endl;
ListTraverse(L);
cout<<endl;
}
else cout<<"A NULL DuLinkList have been created !"<<endl;
}
//ListInsert_Dul()
int ListInsert_DuL(DuLinkList &L)
{
DuLNode *p=L,*s;
int j=0;
int i;
int e;
cout<<"======"<<"before insert:"<<"======"<<endl;
ListTraverse(L);
cout<<"input the location you want to insert:";
cin>>i;
while (i<1||i>ListLength(L)+1)
{
//i值不合法
cout<<"illeagle location,please input the correct location:";
cin>>i;
}
cout<<"input the number you want to insert:";
cin>>e;
while(j<i)
{ p=p->next;
++j;
}
if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
{
cout<<endl<<"Allocate space failure ! " ;
return (ERROR);
}
s->data=e;
s->prior=p->prior;
s->next=p;
if(i==1)
L->next=s;
p->prior->next=s;
p->prior=s;
cout<<"has insert:"<<e<<endl;
ListTraverse(L);
cout<<"======"<<"after insert:"<<"======"<<endl<<endl;
return (OK);
}
// 刪除帶頭結點的雙鏈循環線性表L的第i個元素,i的合法值為1≤i≤表長
int ListDelete(DuLinkList L)
{
DuLinkList p;
int j=1; // j為計數器
int e;
int i;
cout<<"input the location of the number you want to delete"<<endl;
cin>>i;
while(i<0||i>ListLength(L))
{
//i值不合法
cout<<"illeagle location,please input the correct location:";
cin>>i;
}
p=L->next; // p指向第一個結點
while(p!=L&&j<i) // 順指針向後查找,直到p指向第i個元素或p指向頭結點
{
p=p->next;
j++;
}
if(p==L||j>i) // 第i個元素不存在
{
cout<<"第i個元素不存在"<<endl;
return ERROR;
}
else
{
cout<<"======"<<"before delete:"<<"======"<<endl;
ListTraverse(L);
e=p->data; // 取第i個元素
if(!p) // p=NULL,即第i個元素不存在
return ERROR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
cout<<"has delete:"<<e<<endl;
ListTraverse(L);
cout<<"======"<<"after delete:"<<"======"<<endl<<endl;
return OK;
}
}
void menu(int c)
{
cout<<"================================================="<<endl;
cout<<"\t\t1----建立"<<endl;
cout<<"\t\t2----插入"<<endl;
cout<<"\t\t3----刪除"<<endl;
cout<<"\t\t4----逆置"<<endl;
//cout<<"\t\t5----菜單"<<endl;
cout<<"\t\t0----退出"<<endl;
cout<<"================================================="<<endl;
cout <<endl<<"input you choice number:";
}
void main()
{
DuLinkList L;
int c=1;
while(c!=0)
{
switch(c)
{
case 0:
break;
case 1:
CreateList_DuL(L);
break;
case 2:
ListInsert_DuL(L);
break;
case 3:
ListDelete(L);
break;
case 4:
ListTraverseBack(L);
break;
default:
cout<<"infeasible choice,input again:"<<endl;
menu(c);
cin>>c;
}
if(c!=0)
{
menu(c);
cin>>c;
}
}
}
⑨ 小女跪求用c語言 循環鏈表 編寫的約瑟夫環!!
#include<stdio.h>
#include<stdlib.h>
//聲明循環鏈表結構體
typedefstructLNode
{
intnum;//數據域
structLNode*next;//結構體指針
}LNode;//結點類型
//創建結點
LNode*Create_node(intLnum)
{
LNode*Lp;//創建結點指針
Lp=(LNode*)malloc(sizeof(LNode));//分配動態儲存空間
Lp->num=Lnum;//*Lp指向num,把num的值傳給Lnum
Lp->next=NULL;//*Lp指向下一個元素結點為空,確定*Lp是頭結點指針
returnLp;//返回頭結點指針
}
//創建循環鏈表
LNode*Create_Linklist(LNode*pHead,intLsum)
{
intk;
LNode*p,*temp;//創建兩個指針
for(k=1;k<=Lsum;k++)//遍歷整個鏈表
{
p=Create_node(k);
//如果鏈表為空,創建鏈表第一個結點,其next指針指向自身
if(pHead==NULL)
{
temp=p;//把p的值傳給temp
pHead=p;//把p的值傳給pHead
temp->next=pHead;//讓*temp指向的下一個位置為pHead
}
//否則,執行插入節點操作
else
{
p->next=temp->next;//空白指針跟著*p後面,一個接一個插入
temp->next=p;
temp=p;//把p的值再傳給temp
}
}
//測試是否生成循環鏈表成功!
p=pHead;
k=1;//初始化k的值
while(p->next!=pHead)//用循環輸出鏈表中的元素
{
printf("第%d個小孩的編號為:%d ",k,p->num);
p=p->next;//指針移向下一個位置
k++;
}
printf("第%d個小孩的編號為:%d ",k,p->num);//確保最後一個元素能顯示出來
returnpHead;//返回頭指針
}
//執行出列操作
voidDelete_Linklist(LNode*pHead,intLstart,intLdel)
{
inti,count=1;//count為計數器
LNode*p,*temp;
p=pHead;
//找到第M個孩子所在的位置
for(i=1;i<Lstart;i++)
p=p->next;
//只剩1個結點時終止循環
while(p->next!=p)
{
//找到要出列的孩子的位置
for(i=1;i<Ldel;i++)
{
temp=p;
p=p->next;
}
//執行出列操作
temp->next=p->next;//讓*temp指向*p後面的結點
printf("第%d個出列的小孩的編號為:%d ",count,p->num);
free(p);//釋放*p
count++;
//出列者的下一個孩子作為新的第一個報數者
p=temp->next;
宏擾}
printf("第%d個出列的小孩的編號為:%d ",count,p->num);
free(p);
//所有人均出列,頭結點釋放後賦空值,避免出現懸垂指針
pHead=NULL;
}
/*主函數*/
intmain()
{
intn,b,k;
LNode*pHead=NULL,*p;//執行初始化操作
嘩絕旅//輸入字元的合法性驗證暫時忽略
printf("請輸入小孩的個數: ");
scanf("%d",&n);
printf("請輸入開始報數的小孩編號: ");
scanf("%d",&b);
printf("請輸入報數數目: ");
scanf("%d",&k);
p=Create_Linklist(pHead,n);//調用創建鏈表函數
Delete_Linklist(p,b,k);//調用刪亂凳除鏈表函數
return0;
}
⑩ c語言建立鏈表的問題,請講循環語句中的幾句詳細解釋下。
while(x!
=
-1) {
//
只要數據值不是-1就繼續。
s
=
(struct
node
*)malloc(sizeof(struct
node));
//為結構數據s申請存儲空間。
s->data
=
x;
//存入數據。
r->next
=
s;
//前一個鏈表的指針指向本結構。
r
=
s;
//
作為臨時的s正式加入鏈錶行列。
scanf("%d",&x);//讀入新數據。
}
r->next=NULL;//
鏈表的最後成員的指針指向NULL,表明鏈表的末尾。