关于链表的c语言程序

关于链表的c语言程序,第1张

//兄弟,好好看看带头结点和不带头结点的链表的区别,还有如果你设了全局变量n记录链表长度,length()这个函数就多余了,你可以在删除数据时把n-1,插入数据时把n+1就行了,我简单改了改,你看看吧!!

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef struct node

{

int data

struct node *next

}slink

int n

slink *creat() //创建链表

int insert(slink *head,int i,int x)//在结点i之前播放一个数x

int del(slink *head,int i,int *x) //删除第i个结点并返回该结点上的数值

slink *get(slink *head,int i) //查找第i个结点,并返回

int length(slink *head) //求链表的长度

void print(slink *head) //输出链表

int main()

{

slink *head

int de,num=0,ins,len //de为要删除的结点,ins为要插入的结点

//这里num要用整形数,不用指针

printf("input records:\n")

head=creat()

print(head)

printf("\ninput the delete number:(the number<%d)",n)

scanf("%d",&de) /键含笑/这里少了一个&符

if(del(head,de,&num)==1)

{

print(head)

printf("%d",num)

}

else

printf("delete failure!")

printf("\ninput the inset record:")

scanf("%d",&ins)

if(insert(head,2,ins)==1)

print(head)

else

printf("the insert is failure!")

len=length(head)

printf("the length is %d\n",len)

return 0

}

slink *creat() /*定义函数,返回带头结点的链表*/ //兄弟,你建的是不带头结点的链表,带头结点的链表的头结点是不存数据的!!!

{

slink *head

slink *p1,*p2

n=0

head=NULL

p1=p2=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

while(p1->data!=0)

{

n=n+1

if(n==1) head=p1

else p2->next=p1

p2=p1

p1=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

}

p2->next=NULL

return (head)

}

int insert(slink *head,int i,int x)

{

slink *p,*pre,*q

int j=0

p=(slink*)malloc(sizeof(slink))

p->data=x

pre=head/*pre指向待插入结点的前驱结点*/

q=head->next /*q指向当前比较结点*/

while(q&&j<i-1) /*查找p结点应该插入的位置*/

{pre=q

q=q->next

j++

}

if(j!=i-1||i<1) return 0 /*插入不成功*/老局

else

{p->next=q /*将p结点插入链表*/

pre->next=p

}

return 1 /*插入成功*/

}

int del(slink *head,int i,int *x)/*删除第i个结点稿含,并通过x返回值*/

{

slink *p,*q

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/

{

p=p->next

j++

}

if(!(p->next)||j>i-1) return 0 /*删除位置不合适*/

q=p->next /*删除并释放结点*/

p->next=q->next

*x=q->data

free(q)

n-- //删除了数据,总数n应该减1吧?

return 1

}

slink *get(slink *head,int i) /*查找第i个结点*/

{slink *p

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱*/

{p=p->nextj++}

if(!(p->next)&&j>i-1) return NULL

return p->next

}

int length(slink *head) /*求表的长度*/

{int len=0

slink *p

p=head /*设该表有表头*/

while(p){p=p->nextlen++} //你建的是不带头链表,所以这里少了一个

return len

}

void print(slink *head)

{slink *p

printf("\nNow,these %d records are :\n",n)

p=head

if(head!=NULL)

do

{printf("%d \n",p->data)

p=p->next

}while(p!=NULL)

}

前阵子做的用单向链表实现约瑟夫问题:

有M个人围一圈玩报数,凡报到N的槐液出退出团明行,输出每次退出的人的编号。

#include "stdio.h"

struct game

{

int ID

game *pNext

}

void main()

{

int i,m=17,n=3

game *pPrev,*pNode,*pTop

printf("Input M N:")

scanf("%d %d",&m,&n)

if(n>m||n<1) return

pTop=new game

pTop->塌哗ID=1

pPrev=pTop

for(i=2i<=mi++)

{

pNode=new game

pNode->ID=i

pPrev->pNext=pNode

pPrev=pNode

}

pNode->pNext=pTop

pPrev=pNode

pNode=pTop

i=0

while(pNode->pNext!=pNode)

{

i++

if(i%n==0)

{

printf("%d ",pNode->ID)

pPrev->pNext=pNode->pNext

delete pNode

pNode=pPrev->pNext

i=0

}

else

{

pPrev=pNode

pNode=pNode->pNext

}

}

delete pNode

}

主函数这里

Linklist List

printf("输入创建链表的长度:")

scanf("%d",&num)

CreateList_H(List,num) //创建链表

改为 

LNode List

printf("输入创建链此缓表的长度:")

scanf("%d",&num)

CreateList_H(&List,num) //创建链表

函数内在堆上分配好内存,但是 没有传递到栈上

另外 你的变量名很闷备迷人森罩模


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8266902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存