c語言建立循環鏈表
A. 如何用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;
}
B. 關於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語言建立鏈表的問題,請講循環語句中的幾句詳細解釋下。
while(x!=-1)//若輸入-1,創建鏈表結束,不再執行循環體
{
s=(struct
node
*)malloc(sizeof(struct
node));//創建節點,
s->data=x;//把輸入的數據保存在當前創建的節點
r->next=s;//把當前創建節點的地址賦給上個節點的指針,形成鏈表
r=s;//保存當前創建的節點s到r,方便循環創建鏈表節點
scanf("%d",&x);
}
r->next=NULL;//把尾節點的指針指向NULL,表示鏈表的結束
D. 【懸賞】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;
}
E. c語言循環單鏈表的創建.有句程序不明白高人幫忙指導一下,十分感謝
樓主第一個函數是一個數據存儲的函數吧
先解釋下3個指針變數的作用
*head:用於保存頭文件的指針
*p:用於指向當前的下一個地址,只起到臨時作用
*q:用於保存當前位置的地址
函數邏輯是用*head保存頭指針,然後先移動*p,如果*p指向的是*head,說明這條鏈只有一個節點,就是頭地址(頭指針指向的地址),既然要繼續,所以需要if(head->next==head)這句來判斷是否*p指向的是頭地址;如果不是*p指向的不是頭地址,那麼*p前移,然後*q也前移,*p一定要比*q先前移,所以*p在*q前面。
如果輸入完畢了,及輸入了回車號<CR>,結束輸入,然後*q指向頭*head。
那個print()函數是用來輸出的,輸出除了第一個元素以後的字母。
p=tail->next->next這句話就是p指向tail的下一個的下一個元素的地址,首先,p的初始值是上面的head頭地址的內容,裡面什麼都沒有,所以要一個next指向下一個,那麼再下一個,就是第二個字母了,具體為什麼要從第2個字母開始輸出,就要問你了,不懂這個print()的目的。
哈哈,你的第一個函數返回的應該是q
F. 循環鏈表怎麼建立。c語言
是的
建立單向循環鏈表的代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct _A{
int data;
stru<img id="selectsearch-icon" src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png" alt="搜索">ct _A *next;
}A;
typedef A* IA;
void createDoubleLink(IA *header) {
int data;
IA p;
printf("input data end with -1:");
scanf("%d", &data);
while(data != -1) {
p = (IA)malloc(sizeof(A));
p->data = data;
if(*header == NULL) {
*header = p;
(*header)->next = *header;
}
else{
IA q = *header;
while(q->next != *header) {
q = q->next;
}
q->next = p;
q->next->next = *header;
}
scanf("%d", &data);
}
}
void print(IA header) {
IA p = header;
if(header == NULL) return;
while(1){
printf("%d\t", p->data);
if(p->next == header) break;
p = p->next;
}
printf("\n");
}
int main()
{
IA header = NULL;
createDoubleLink(&header);
print(header);
return 0;
}
頭結點的意思是鏈表的第一個節點,但這個節點不保存數據。
G. 數據結構雙向循環鏈表的C語言實現(插入,查詢,刪除),代碼如下:
#include<stdio.h>
#include<malloc.h>
typedefintElemtype;
typedefstructdNode{
Elemtypedata;/*數據域*/
structdNode*prior;/*指向前驅結點的指針域*/
structdNode*next;/*指向後繼結點的指針域*/
}*pDLink,*DLinkList;
DLinkListGetEmptyDLink(){//初始化
DLinkListhead=(pDLink)malloc(sizeof(structdNode));
head->data=0;
head->prior=head;
head->next=head;
returnhead;
}
voidDLink_create(DLinkListhead,intn){/*雙向循環鏈表建立函數*/
inti;
pDLinkp,r;
p=r=head;
for(i=0;i<n;i++){
p->next=(pDLink)malloc(sizeof(structdNode));/*為一個新結點分配空間*/
scanf("%d",&p->next->data);/*從鍵盤輸入值,並保存在新結點數據域中*/
p=p->next;//p指向新結點
p->prior=r;//新結點的prior指向上一個結點
r=r->next;//上一個結點前進到新結點
}
p->next=head;//指向頭結點
head->prior=p;//head的prior指向最後的結點
}
voidShow(DLinkListhead){//正向顯示鏈表數據
pDLinkp=head->next;
while(p!=head){
printf("%d",p->data);
p=p->next;
}
printf(" ");
}
voidShowR(DLinkListhead){//反向顯示數據
pDLinkp=head->prior;
while(p!=head){
printf("%d",p->data);
p=p->prior;
}
printf(" ");
}
intmain(){
DLinkListhead=GetEmptyDLink();
DLink_create(head,10);
printf("正向顯示: ");
Show(head);
printf("反向顯示: ");
ShowR(head);
return0;
}
H. 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);
}