當前位置:首頁 » 編程語言 » c語言鏈表創建

c語言鏈表創建

發布時間: 2022-09-04 16:28:08

㈠ 用c語言建立一個有序鏈表

先按正常流程建立一個鏈表,再按照其某一個成員值進行冒泡排序(排序過程的交換,只交換鏈表指針以外的成員值)。

演示代碼如下:(演示代碼鏈表20個節點,成員值為隨機值)

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

typedef struct slist

{

int a;

struct slist *next;

}SLIST;

SLIST *init();//生成20個節點成員為隨機數的鏈表

void showList(SLIST *slHead);//列印鏈表

void px(SLIST *slHead,int flag);//float=1:降序。=2升序

int main()

{

SLIST *slHead=NULL;

slHead=init();

printf("排序前: ");

showList(slHead);

printf(" 降序排序後: ");

px(slHead,1);

showList(slHead);

printf(" 升序排序後: ");

px(slHead,2);

showList(slHead);

return 0;

}

void px(SLIST *slHead,int flag)//flag=1:降序。=2升序

{

SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;

while(sl0)

{

sl1=sl0->next;

while(sl1)

{

if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))

{

slSave=*sl0;

*sl0=*sl1;

sl0->next=slSave.next;

pSave=sl1->next;

*sl1=slSave;

sl1->next=pSave;

}

sl1=sl1->next;

}

sl0=sl0->next;

}

}

void showList(SLIST *slHead)

{

int i=0;

while(slHead->next)

{

printf("節點%d成員值:%d ",++i,slHead->next->a);

slHead=slHead->next;

}

printf(" ");

}

SLIST *init()

{

int num,cnt=20;

static SLIST head;

SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;

slHead->next=NULL;

srand(time(NULL));

while(cnt--)

{

num=rand()%100;

slNew=(SLIST *)malloc(sizeof(SLIST));

if(!slNew)return NULL;

slNew->a=num;

slNew->next=NULL;

if(!slHead->next)

slHead->next=slNew;

else

slTail->next=slNew;

slTail=slNew;

}

return slHead;

}

㈡ C語言 關於鏈表的創建

#include<stdio.h>
#include<stdlib.h>

typedefintelemtype;
typedefstructLnode{
elemtypedata;
Lnode*next;
}Lnode;

Lnode*CreatList(Lnode*Head){
Head=(Lnode*)malloc(sizeof(Lnode));
Head->next=NULL;
Lnode*p=Head;
printf("請輸入元素的個數:");
inti,n;
scanf("%d",&n);
for(i=0;i<n;++i){
p->next=(Lnode*)malloc(sizeof(Lnode));
printf("請輸入第%d個元素:",i+1);
scanf("%d",&p->next->data);
p=p->next;
}
p->next=NULL;
returnHead;
}

voidAllList(Lnode*head){
Lnode*p=head->next;
while(p){
printf("%d",p->data);
p=p->next;
}
printf(" ");
}

intmain(){
Lnode*head=NULL;
head=CreatList(head);
AllList(head);
return0;
}

㈢ C語言鏈表的建立與插入

//C語言鏈表的建立與插入

#include <stdio.h>
#include <stdlib.h>
//使用結構體構建鏈表
struct node{
int data;
struct node *next;
};
void main()
{
int n=1;int a;
struct node *p,*head,*tail,*t;
//申請動態空間
p=(struct node *)malloc(sizeof(struct node));
//head=(struct node *)malloc(sizeof(struct node));
t=(struct node *)malloc(sizeof(struct node));
head=tail=p; //////////////////////////////////////
for(;n<=5;n++) //輸入1,3,5,7,9 {
{
p->data=2*n-1;
p->next =NULL;
tail->next=p;
tail=p;
p=(struct node *)malloc(sizeof(struct node));
}
//輸出原始數據
printf("原始鏈表如下:\n"); //輸出原始鏈表
for(p=head;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
//插入數據
printf("\n請輸入需要插入的數據\n"); //輸入所要插入的新數據
scanf("%d",&a );
for(p=head;p!=NULL;) //按順序插入相應位置
{
if(p->data <a && (p->next)->data >a)
{
t->data =a;
t->next =p->next ;
p->next=t;
}
p=p->next ;
}
printf("插入新數據後的鏈表\n"); //輸出插入新數據的鏈表
for(p=head;p!=NULL;)
{
printf("%d ",p->data);
p=p->next;
}
free(p);
free(head);
free(t);
printf("\n");
}

㈣ c語言創建鏈表

1、你使用了malloc函數但沒有導入頭文件malloc.h。
2、函數DATA *create(int n);沒有申明就直接調用。
(另外main函數中DATA* head;給個初值NULL,避免野指針。)
修改以上內容,親測可運行。

㈤ C語言創建鏈表,函數調用部分


#include<stdio.h>
#include<windows.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//定義數據類型名稱
typedef int DataType;

#define flag -1 //定義數據輸入結束的標志數據

//單鏈表結點存儲結構定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;

//建立單鏈表子函數
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定義指向當前插入元素的指針
while(1)
{
scanf("%d",&x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s->data =x;
s->next =NULL;
i++;
if(i==1)
head=s;
else
L->next =s;
L=s;

}
}
//查找子函數(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是計數器,用來判斷當前的結點是否是第i個結點
p=L;
j=1;
while(p!=NULL&&j<i)
{
p=p->next ; //當前結點p不是第i個且p非空,則p移向下一個結點
j++;
}
return p;
}

//插入運運算元函數
void Insert_LinkList(LinkList L,int i,DataType x) //在單鏈表L中第i個位置插入值為x的新結點
{
LNode *p,*s;
p =Get_LinkList(L,i); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s->data =x;
s->next =p->next ;
p->next =s;
}
}

//單鏈表的刪除運運算元函數
void Delete_LinkList(LinkList L,int i) //刪除單鏈表上的第i個結點
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("刪除的位置不合法!"); //第i個結點的前驅結點不存在,不能執行刪除操作
exit(-1);
}
else
{
if(p->next ==NULL)
{
printf("刪除的位置不合法!"); //第i個結點不存在,不能執行刪除操作
exit(-1);
}

else
{
q=p->next ;
p->next =p->next->next;
free(q);
}
}
}

//求表長運運算元函數
int Length_LinkList(LinkList L)
{
int l; //l記錄L的表長
LNode *p;
p=L;
l=1;
while(p->next)
{
p=p->next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu******* ");
printf("**創建**********1* ");
printf("**插入**********2* ");
printf("**刪除**********3* ");
printf("**表長**********4* ");
printf("**清屏**********5* ");
printf("**列印**********6* ");
printf("**退出******other* ");
printf("****************** ");
int i=1;
while(i)
{
printf("請輸入選項:");
scanf("%d",&i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("請輸入位置和數據;");
scanf("%d%d",&x,&y);
Insert_LinkList(head,x,y);break;
case 3:printf("請輸入位置;");
scanf("%d",&x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d ",p->data);
p=p->next;}
break;
default :i=0;
}
}
}

我把創建給改了一下

㈥ c語言鏈表的創建

這個鏈表做得不好。其實鏈表可以不用創建這一步。因為插入操作已經包含有創建功能了。else後面的語句,就如同你給繩子打結一樣。鏈表的節點好比一段一段的繩子,現在你需要把它們都接起來。你每接一段,手就要往後移動一節,以准備給下一段打結。else後面的語句,其實就是讓當前指針指向的節點後移。
我給你個程序:
#include <stdio.h>
#include <stdlib.h>

typedef struct tagPERSON //個人信息結構
{
char name[20];
long age;
}PERSON;

//template<typename DT> //如果是C++的話,這里方便許多,可以使用模板和類
typedef struct tagLNODE* pLNODE;
typedef struct tagLNODE //鏈表節點
{
PERSON data;
pLNODE next;
}LNODE;

int link_insert(pLNODE *head,PERSON data)//鏈表插入
{
pLNODE cur_tmp,lnode_tmp;

cur_tmp=*head;
lnode_tmp=(pLNODE)malloc(sizeof(LNODE));
if(lnode_tmp==NULL)return -1;
lnode_tmp->data=data;
lnode_tmp->next=NULL;

if(*head==NULL)
*head=lnode_tmp; //如果head為空,則需要對main()中的head修改,所以head的類型為指向指針的指針
else
{
while(cur_tmp->next!=NULL)
cur_tmp=cur_tmp->next;
cur_tmp->next=lnode_tmp;
}

return 0;
}

int link_display_cmd(pLNODE head) //控制台下的鏈表顯示
{
pLNODE cur_tmp;

cur_tmp=head;
while(cur_tmp!=NULL)
{
printf("%s:%d\n",(cur_tmp->data).name,(cur_tmp->data).age);
cur_tmp=cur_tmp->next;
}
return 0;
}

int link_clear(pLNODE *head) //清空鏈表
{
pLNODE cur_tmp,old_tmp;

cur_tmp=*head;
while(cur_tmp!=NULL)
{
old_tmp=cur_tmp;
cur_tmp=cur_tmp->next;
free(old_tmp);
}

*head=NULL;
return 0;
}

int main(void)
{
pLNODE head=NULL;
PERSON temp;

printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
while(temp.age>0)
{
link_insert(&head,temp);
printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
}

link_display_cmd(head);
link_clear(&head);

return 0;
}

㈦ 用c語言創建鏈表

主函數這里

LinklistList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(List,num); //創建鏈表
改為
LNodeList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(&List,num); //創建鏈表

函數內在堆上分配好內存,但是 沒有傳遞到棧上

另外你的變數名很迷人

㈧ 如何用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>
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*next;
}linklist;
linklist*p,*q,*head;
main()
{
charc;
head=(linklist*)malloc(sizeof(linklist));
head->next=null;
p=head;
c=getchar();
while(c!='@')
{
q=(linklist*)malloc(sizeof(linklist));
q->data=c;
q->next=null;
p->next=q;
p=p->next;
c=getchar();
}
}
可以在main()最後加上
for(p=head->next;p!=null;p=p->next)
{
printf("%5c",p->data);
}
來測試結果,本人已經tc2.0下面測試通過.

㈩ C語言鏈表創建和輸入

#include "link.h"
//實現類似於strlen
struct string_linkinfo BL_Stringlen(BLString *link)
{
struct string_linkinfo st_string = {0, 0};
char *p;
Block *pnode = NULL;
if(NULL == link){
printf("Invalid arg...\n");
return st_string;
}
//鏈表為空
if(NULL == link->head){
return st_string;
}
else{
pnode = link->head;
while(pnode != link->tail)
{
st_string.length += N;
st_string.count_node++;

pnode = pnode->next;
}//當while循環執行完後,pnode一定是最後一個節點
p = pnode->buffer;
st_string.count_node++;
while('\0' != *p)
{
st_string.length++;
p++;
}
}
return st_string;
}

//實現類似於strcmp
int BL_Stringcmp(BLString *link1, BLString *link2)
{
assert(NULL != link1 && NULL != link2);//斷言
int i;
Block *pnode1 = link1->head;
Block *pnode2 = link2->head;
while(pnode1 != link1->tail && pnode2 != link2->tail)
{
for(i = 0; i < N; i++)
{
if((pnode1->buffer)[i] != (pnode2->buffer)[i])
return (pnode1->buffer)[i] - (pnode2->buffer)[i];
}
pnode1 = pnode1->next;
pnode2 = pnode2->next;
}
return strcmp(pnode1->buffer, pnode2->buffer);
}
//實現類似於strcpy
/*BLString *BL_Stringcpy(BLString *link1, BLString *link2)
{

}*/
//類似於strcat
BLString *BL_Stringcat(BLString *link1, BLString *link2)
{
//函數入口檢測
if(NULL == link1 || NULL == link2)
{
printf("Invalid arg...\n");
return NULL;
}
if(NULL == link1->head){
link1->head = link2->head;
}
else//都不為空
{
int i, tmp = 0;
Block *pnode1 = link1->head;
Block *pnode2 = link2->head;
while(pnode1 != link1->tail)//將pnode1定位到末尾
pnode1 = pnode1->next;
//先看看缺多少個字元
tmp = strlen(pnode1->buffer);
//尾首鏈接
pnode1->next = pnode2;
while(pnode2 != link2->tail)
{
for(i = 0; i < N - tmp; i++)
(pnode1->buffer)[tmp + i] = (pnode2->buffer)[i];
for(i = 0 ; i < tmp; i++)
(pnode2->buffer)[i] = (pnode2->buffer)[N-tmp+i];
pnode1 = pnode1->next;
pnode2 = pnode2->next;
}
if(strlen(pnode2->buffer) < N-tmp)
{
for(i = 0; i < strlen(pnode2->buffer); i++)
(pnode1->buffer)[tmp + i] = (pnode2->buffer)[i];

(pnode1->buffer)[tmp+i] = '\0';
free(pnode2);
link1->tail = pnode1;
}
else{
for(i = 0; i < N - tmp; i++)
(pnode1->buffer)[tmp + i] = (pnode2->buffer)[i];
strcpy(pnode2->buffer, (pnode2->buffer)+(N-tmp));
link1->tail = pnode2;
}
link1->tail->next = NULL;
}

return link1;
}
void BL_Printstring(BLString *plink)
{
int i;
if(NULL == plink){
printf("Invalid arg...\n");
return ;
}
if(NULL == plink->head){
printf("The string is empty...\n");
return ;
}
Block *pnode = plink->head;
while(pnode != plink->tail)
{
for(i = 0; i < N; i++)
printf("%c", (pnode->buffer)[i]);

pnode = pnode->next;
}
printf("%s\n", pnode->buffer);

return;
}

熱點內容
可緩存影視 發布:2025-01-15 07:42:50 瀏覽:799
php函數默認值 發布:2025-01-15 07:34:31 瀏覽:238
編譯應用後apk無法打開 發布:2025-01-15 07:33:45 瀏覽:437
lc腳本編輯器 發布:2025-01-15 07:18:59 瀏覽:528
追劇腳本 發布:2025-01-15 07:00:39 瀏覽:446
c語言字元串庫函數 發布:2025-01-15 06:54:49 瀏覽:526
c語言的工作 發布:2025-01-15 06:50:50 瀏覽:521
口語交際訪問 發布:2025-01-15 06:44:13 瀏覽:329
編程少兒學習 發布:2025-01-15 06:39:03 瀏覽:504
伺服器搭建怎麼設置 發布:2025-01-15 06:39:01 瀏覽:152