#includestdio.h
創(chuàng)新互聯(lián)建站10多年企業(yè)網(wǎng)站設(shè)計服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站設(shè)計及推廣,對樓梯護(hù)欄等多個方面擁有豐富的網(wǎng)站推廣經(jīng)驗的網(wǎng)站建設(shè)公司。
#includestdlib.h
//鏈表定義
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 鏈表函數(shù) *
*************************************/
//鏈表初始化
void InitLink(LinkList L);
//創(chuàng)建函數(shù),尾插法
void CreateLink_T(LinkList L,int n);
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n);
//銷毀函數(shù)
void DestroyLink(LinkList L);
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L);
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e);
//插入函數(shù)
void InsertLink(LinkList L,int i,int e);
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e);
//遍歷函數(shù)
void TraverseLink(LinkList L);
//鏈表長度函數(shù)
int LengthLink(LinkList L);
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//創(chuàng)建函數(shù),尾插法
void InitLink(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L-next=NULL;
}
void CreateLink_T(LinkList L,int n)
{
if(n1)
{
printf("n must =1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",(p-data));
p-next=L-next;
L-next=p;
}
}
}
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n)
{
if (n1)
{
printf("n must =1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
pre=L;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",(p-data));
pre-next=p;
pre=p;
}
pre-next=NULL;
}
}
//銷毀函數(shù)
void DestroyLink(LinkList L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p-next;
free(q);
}
L-next=NULL;
}
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L)
{
if (NULL==L-next)
{
return true;
}
else
{
return false;
}
}
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e)
{
if (i1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L-next;
int j=1;
while(pji)
{
p=p-next;
j++;
}
if (!p||ji)
{
return false;
}
else
{
e=p-data;
return true;
}
}
}
//插入函數(shù)
void InsertLink(LinkList L,int i,int e)
{
if (i0||iLengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p(ji))
{
p=p-next;
j++;
}
if (!p||ji)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q-data=e;
q-next=p-next;
p-next=q;
}
}
}
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e)
{
if(i=0||iLengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(pji-1)
{
p=p-next;
j++;
}
if(!p||ji)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p-next;
e=p-next-data;
p-next=p-next-next;
free(q);
}
}
}
//遍歷函數(shù)
void TraverseLink(LinkList L)
{
LinkList p=L-next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p-data);
p=p-next;
}
}
//鏈表長度函數(shù)
int LengthLink(LinkList L)
{
int i=0;
LinkList p=L-next;
while(p)
{
p=p-next;
i++;
}
return i;
}
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1-next,p2=L2-next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p-next=NULL;
while (p1p2)
{
if (p1-data=p2-data)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
else
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
}
while (p1)
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
while(p2)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
while(pre)
{
pre=pre-next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
#include\x0d\x0a#include\x0d\x0a#include \x0d\x0a//先定義一種student類型,表示一個學(xué)生的信息,如下:\x0d\x0atypedef struct student\x0d\x0a{\x0d\x0aint num; //表示學(xué)號\x0d\x0achar name[30]; //表示姓名\x0d\x0afloat score; //表示分?jǐn)?shù)\x0d\x0a}student;\x0d\x0a//定義一種NODE類型,表示一個結(jié)點信息,如下:\x0d\x0atypedef struct node\x0d\x0a{\x0d\x0astudent st; //表示一個學(xué)生的信息\x0d\x0astruct node *next; //表示一個NODE類型的指針\x0d\x0a}NODE;\x0d\x0a//1、寫出建立一個帶頭結(jié)點的線性鏈表的函數(shù),其中每個結(jié)點包括學(xué)號、姓名、分?jǐn)?shù)三個數(shù)據(jù)域。函數(shù)形式如下:\x0d\x0aNODE *creat_link(int direction)\x0d\x0a{\x0d\x0aNODE *head,*p,*tail;\x0d\x0aint xh,i=1;\x0d\x0aif(direction==1) //當(dāng)direction的值為1時,新建立的結(jié)點連到尾部\x0d\x0a{\x0d\x0atail=head=(NODE *)malloc(sizeof(NODE));\x0d\x0ahead-next=NULL;\x0d\x0aprintf("請輸入第%d個學(xué)生的學(xué)號:",i);\x0d\x0ascanf("%d",xh);\x0d\x0awhile(xh0) //從鍵盤臨時輸入學(xué)生情況,當(dāng)輸入的學(xué)號非正,則鏈表建立完畢\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE));\x0d\x0ap-st.num=xh;\x0d\x0aprintf("請輸入第%d個學(xué)生的姓名:",i);\x0d\x0ascanf("%s",p-st.name);\x0d\x0aprintf("請輸入第%d個學(xué)生的成績:",i);\x0d\x0ascanf("%f",p-st.score);\x0d\x0ap-next=NULL;\x0d\x0atail-next=p;\x0d\x0atail=p;\x0d\x0ai=i+1;\x0d\x0aprintf("請輸入第%d個學(xué)生的學(xué)號:",i);\x0d\x0ascanf("%d",xh);\x0d\x0a}\x0d\x0a}\x0d\x0aelse if(direction==0) //當(dāng)direction為0時,新建立的結(jié)點成為第一個結(jié)點\x0d\x0a{\x0d\x0ahead=(NODE *)malloc(sizeof(NODE));\x0d\x0ahead-next=NULL;\x0d\x0aprintf("請輸入第%d個學(xué)生的學(xué)號:",i);\x0d\x0ascanf("%d",xh);\x0d\x0awhile(xh0) //從鍵盤臨時輸入學(xué)生情況,當(dāng)輸入的學(xué)號非正,則鏈表建立完畢\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE));\x0d\x0ap-st.num=xh;\x0d\x0aprintf("請輸入第%d個學(xué)生的姓名:",i);\x0d\x0ascanf("%s",p-st.name);\x0d\x0aprintf("請輸入第%d個學(xué)生的成績:",i);\x0d\x0ascanf("%f",p-st.score);\x0d\x0ap-next=head-next;\x0d\x0ahead-next=p;\x0d\x0ai=i+1;\x0d\x0aprintf("請輸入第%d個學(xué)生的學(xué)號:",i);\x0d\x0ascanf("%d",xh);\x0d\x0a}\x0d\x0a}\x0d\x0areturn head;\x0d\x0a}\x0d\x0a//2、寫出輸出上述鏈表各結(jié)點數(shù)據(jù)域值的函數(shù)。該函數(shù)對應(yīng)的函數(shù)需要一個形參,表示鏈表的頭指針,形式如下:\x0d\x0avoid print_link(NODE *head)\x0d\x0a{\x0d\x0aNODE *p;\x0d\x0ap=head-next;\x0d\x0aprintf("%-10s%-20s%-10s\n","學(xué)號","姓名","分?jǐn)?shù)");\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aprintf("%-10d%-20s%-10.1f\n",p-st.num,p-st.name,p-st.score);\x0d\x0ap=p-next;\x0d\x0a}\x0d\x0a//該函數(shù)能輸出head所指的鏈表的所有結(jié)點值,輸出形式如下:\x0d\x0a/*本函數(shù)輸出線性表sq中所有數(shù)據(jù),形式如下:\x0d\x0a學(xué)號 姓名 分?jǐn)?shù)\x0d\x0a12 張三 234.5\x0d\x0a18 李四 987.7\x0d\x0a??? ??? ??.*/\x0d\x0a}\x0d\x0a//3、寫出在鏈表中刪除結(jié)點的函數(shù)\x0d\x0aint del_link(NODE *head,char name[])\x0d\x0a{\x0d\x0aNODE *p,*p1;\x0d\x0ap=head-next;\x0d\x0ap1=head;\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aif(strcmp(p-st.name,name)!=0)\x0d\x0a{\x0d\x0ap1=p;\x0d\x0ap=p-next;\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0abreak;\x0d\x0a}\x0d\x0a}\x0d\x0aif(p!=NULL)\x0d\x0a{\x0d\x0ap1-next=p-next;\x0d\x0afree(p);\x0d\x0areturn 1;\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0areturn 0;\x0d\x0a}\x0d\x0a//刪除head所指的鏈表中,名字為name的結(jié)點,刪除成功返回1,不成功返回0\x0d\x0a}\x0d\x0a//4、寫出在鏈表中插入結(jié)點的算法\x0d\x0aint insert(NODE *head,student x,int wz)\x0d\x0a{\x0d\x0aNODE *p=head;\x0d\x0aint i=0,jg;\x0d\x0aif(wznext;\x0d\x0a}\x0d\x0aif(p==NULL)\x0d\x0a{\x0d\x0ajg=0;\x0d\x0a}\x0d\x0aif(i=wz-1)\x0d\x0a{\x0d\x0a//找到wz前面的節(jié)點,p指向它\x0d\x0aNODE *q;\x0d\x0aq=(NODE *)malloc(sizeof(NODE));\x0d\x0aq-st.num=x.num;\x0d\x0astrcpy(q-st.name,x.name);\x0d\x0aq-st.score=x.score;\x0d\x0aq-next=p-next;\x0d\x0ap-next=q;\x0d\x0ajg=1;\x0d\x0a}\x0d\x0a}\x0d\x0areturn jg;\x0d\x0a//該函數(shù)能夠在wz這個結(jié)點之前,插入一個新結(jié)點,新結(jié)點的數(shù)據(jù)域為x。插入成功返回1,不成功返回0。\x0d\x0a}\x0d\x0a//5、寫出主函數(shù),分別調(diào)用上面算法所對應(yīng)的程序,建立鏈表,并輸出鏈表的值。\x0d\x0avoid main()\x0d\x0a{\x0d\x0aNODE *head; //定義指針變量head\x0d\x0aint wz; //表示插入位置\x0d\x0achar xm[30];\x0d\x0astudent st; //定義一個變量st,用來表示一個學(xué)生的信息\x0d\x0ahead=creat_link(1);\x0d\x0aprint_link(head); //調(diào)用函數(shù)建立鏈表,并把返回值送給head;\x0d\x0a//調(diào)用函數(shù),輸出鏈表中各個結(jié)點的值\x0d\x0a//輸入一個學(xué)生的有關(guān)信息,送給變量st的有關(guān)成員\x0d\x0aprintf("\n\n請輸入要插入的位置:");\x0d\x0ascanf("%d",wz); //輸入wz的值\x0d\x0aprintf("請輸入要插入的學(xué)生的學(xué)號:");\x0d\x0ascanf("%d",st.num);\x0d\x0aprintf("請輸入要插入的學(xué)生的姓名:");\x0d\x0ascanf("%s",st.name);\x0d\x0aprintf("請輸入要插入的學(xué)生的成績:");\x0d\x0ascanf("%f",st.score); \x0d\x0a//調(diào)用函數(shù),在鏈表中把學(xué)生st的值作為一個結(jié)點插入,如果插入成功,輸出新鏈表\x0d\x0aif(insert(head,st,wz)==1)\x0d\x0a{\x0d\x0aprintf("\n插入成功,新表為:\n");\x0d\x0aprint_link(head);\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("插入不成功");\x0d\x0a}\x0d\x0a//調(diào)用函數(shù),在鏈表中刪除一個指定結(jié)點的值,如果刪除成功,輸出新鏈表\x0d\x0aprintf("\n\n請輸入要刪除的學(xué)生的姓名:");\x0d\x0agetchar();\x0d\x0agets(xm);\x0d\x0aif(del_link(head,xm)==1)\x0d\x0a{\x0d\x0aprintf("\n刪除成功,新表為:\n");\x0d\x0aprint_link(head);\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("刪除不成功");\x0d\x0a}\x0d\x0a}
主函數(shù)這里
Linklist?List;
printf("輸入創(chuàng)建鏈表的長度:");
scanf("%d",num);
CreateList_H(List,num); //創(chuàng)建鏈表
改為?
LNode?List;
printf("輸入創(chuàng)建鏈表的長度:");
scanf("%d",num);
CreateList_H(List,num); //創(chuàng)建鏈表
函數(shù)內(nèi)在堆上分配好內(nèi)存,但是 沒有傳遞到棧上
另外?你的變量名很迷人
#includestdio.h
#includestdlib.h
typedef struct data?{?int number;?struct data *next;?} DATA;
int main()?{?int n;?DATA *head,*p;
printf("how many?\n"); scanf("%d",n); head=create(n); printf("there is all\n");
while ( head!=NULL ) { printf("%d ",head-number); head=head-next; } printf("\n");
while ( head!=NULL ) {?p=head; head=head-next; free(p); }
return 0;
}
DATA *create(int n)?{?DATA *head=NULL,*t=NULL,*tial=NULL;?int i;
printf("let's create it\n");?head=(DATA*)malloc(sizeof(DATA));
if ( !head )?{?printf("error"); return NULL;?}
head-next=NULL;?printf("enter your data\n");? scanf("%d",head-number);
for ( i=1,tial=head;in;i++ )?{
t=(DATA*)malloc(sizeof(DATA));?if ( !t )?{?printf("error"); return head; }
scanf("%d",t-number);?t-next=NULL; tial-next=t;?tial=t;
}
return head;
}