本文目录一览:
- 1、求C语言单链表 源代码
- 2、c语言 单链表源代码
- 3、求一份实现单链表的基本操作的c语言程序,包括输入元素,谢谢。
- 4、用C语言实现建立一个单链表的过程,并实现打印链表中每一个元素,写出完整程序
- 5、编写一个C语言程序 实现单链表的基本操作
求C语言单链表 源代码
#includestdio.h
#includestdlib.h
#includestring.h
struct people
{
char name[10];
int age;
struct people * next;
};
int main()
{
struct people * head=NULL;
struct people * prev , * current;
int flag=1;
while(flag!=0)
{
printf("请输入学生姓名,年龄:(年龄输入0结束所有输入工作)\n");
current=(struct people *)malloc(sizeof(struct people));
if(head==NULL)
head=current;
else
prev-next=current;
current-next=NULL;
scanf("%s",current-name);
scanf("%d",current-age);
prev=current;
flag=current-age;
}
printf("Output:\n");
if(head==NULL)
printf("无资料。\n");
else
{
current=head;
while(current-next!=NULL)
{
printf("姓名:%s\n年龄:%d\n\n",current-name,current-age);
current=current-next;
}
}
}
至于排序,断开旧链表,将前后指针链接到新的节点就好
如果还有问题欢迎再问哈
c语言 单链表源代码
#include "stdafx.h"
#include stdio.h
#include malloc.h
typedef char ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
//***********************************************************置空表setnull()
void setnull(struct LNode **p)
{
*p=NULL;
}
//************************************************************求长度length()
int length(struct LNode **p)
{
int n=0;
struct LNode *q=*p;
while (q!=NULL)
{
n++;
q=q-next;
}
return(n);
}
//*************************************************************取结点get()
ElemType get(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p;
while (ji q!=NULL) /**//*查找第i个结点*/
{
q=q-next;j++;
}
if (q!=NULL) /**//*找到了第i个结点*/
return(q-data);
else
{
printf("位置参数不正确!\n");
return NULL;
}
}
//************************************************************按值查找locate()
int locate(struct LNode **p,ElemType x)
{
int n=0;
struct LNode *q=*p;
while (q!=NULL q-data!=x) /**//*查找data域为x的第一个结点*/
{
q=q-next;
n++;
}
if (q==NULL) /**//*未找到data域等于x的结点*/
return(-1);
else /**//*找到data域等于x的结点*/
return(n+1);
}
//**********************************************************插入结点insert()
void insert(struct LNode **p,ElemType x,int i)
{
int j=1;
struct LNode *s,*q;
s=(struct LNode *)malloc(sizeof(struct LNode)); /**//*建立要插入的结点s*/
s-data=x;
q=*p;
if (i==1) /**//*插入的结点作为头结点*/
{
s-next=q;
*p=s;
}
else
{
while (ji-1 q-next!=NULL) /**//*查找第i-1个结点*/
{
q=q-next;j++;
}
if (j==i-1) /**//*找到了第i-1个结点,由q指向它*/
{
s-next=q-next; /**//*将结点s插入到q结点之后*/
q-next=s;
}
else
printf("位置参数不正确!\n");
}
}
//*********************************************************删除结点del()
void del(struct LNode **p,int i)
{
int j=1;
struct LNode *q=*p,*t;
if (i==1) /**//*删除链表的头结点*/
{
t=q;
*p=q-next;
}
else
{
while (ji-1 q-next!=NULL) /**//*查找第i-1个结点*/
{
q=q-next;j++;
}
if (q-next!=NULL j==i-1) /**//*找到第i-1个结点,由q指向它*/
{
t=q-next; /**//*t指向要删除的结点*/
q-next=t-next; /**//*将q之后的结点删除*/
}
else printf("位置参数不正确!\n");
}
if (t!=NULL) /**//*在t不为空时释放该结点*/
free(t);
}
//********************************************************显示链表display()
void display(struct LNode **p)
{
struct LNode *q;
q=*p;
printf("单链表显示:");
if (q==NULL) /**//*链表为空时*/
printf("链表为空!");
else if (q-next==NULL) /**//*链表只有一个结点时*/
printf("%c\n",q-data);
else { /**//*链表存在一个以上的结点时*/
while (q-next!=NULL) /**//*显示前面的结点*/
{
printf("%c→",q-data);q=q-next;
}
printf("%c",q-data); /**//*显示最后一个结点*/
}
printf("\n");
}
void main()
{
struct LNode *head;
setnull(head);
insert(head,'a',1);
insert(head,'b',2);
insert(head,'a',2);
insert(head,'c',4);
insert(head,'d',3);
insert(head,'e',1);
display(head);
printf("单链表长度=%d\n",length(head));
printf("位置:%d 值:%c\n",3,get(head,3));
printf("值:%c 位置:%d\n",'a',locate(head,'a'));
printf("删除第1个结点:");
del(head,1);
display(head);
printf("删除第5个结点:");
del(head,5);
display(head);
printf("删除开头3个结点:");
del(head,3);
del(head,2);
del(head,1);
display(head);
}
/**//*
运行结果:
单链表显示:e→a→a→d→b→c
单链表长度=6
位置:3 值:a
值:a 位置:2
删除第1个结点:单链表显示:a→a→d→b→c
删除第5个结点:单链表显示:a→a→d→b
删除开头3个结点:单链表显示:b
*/
求一份实现单链表的基本操作的c语言程序,包括输入元素,谢谢。
#includestdlib.h
#include "nodedef.h"
#define CreateLinklistWay 1 // 0表示头插法创建链表,1表示尾插法创建链表
#if !CreateLinklistWay
/*********************************************************************
* 函数名称:linklist *CreateLinklistHead()
* 函数功能:利用头插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum;
linklist *head, *temp; // 头结点与临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点
head-next = NULL; // 给表头结点的指针域赋值
printf("请输入链表中结点的个数:");
scanf("%d", nodeNum);
for(i=1; i=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp-data = x; // 对新结点的数据域赋值
// 将新结点插到头结点之后
temp-next = head-next;
head-next = temp;
}
return head; // 返回新建链表的头结点
}
#else
/*********************************************************************
* 函数名称:linklist *CreateLinklistRear()
* 函数功能:利用尾插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum;
linklist *head, *rear, *temp; // 定义头结点、尾结点和临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点,表头结点不存放数据
head-next = NULL; // 将表头结点的指针域赋值为NULL
rear = head; // 将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:");
scanf("%d", nodeNum);
for(i=1; i=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp-data = x; // 新增结点的数据域
temp-next = NULL; // 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear-next = temp; // 使前一个结点指向新增结点(head-next=temp)
rear = temp; // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head-next)
}
//rear-next = NULL; // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
return head; // 返回头结点
}
#endif
用C语言实现建立一个单链表的过程,并实现打印链表中每一个元素,写出完整程序
这是个很简单的链表创建和输出
#includestdio.h
#includestdlib.h
typedef struct linkednode
{
char data;
struct linkednode *next;
}node,*link_list;//链表节点的结构及重命名
link_list creat()//创建一个链表返回类型是链表的首地址
{
link_list L;
node *p1,*p2;
char data;
L=(node*)malloc(sizeof(node));//开辟存储空间
p2=L;
while((data=getchar())!='\n')//输入回车键时结束输入
{
p1=(node*)malloc(sizeof(node));
p1-data=data;
p2-next=p1;
p2=p1;
}
p2-next=NULL;
return L;
}
void print(link_list L)//把链表输出
{
node *p;
p=L-next;
while(p!=NULL)
{
printf("%c",p-data);
p=p-next;
}
printf("\n");
}
void main()
{
link_list L=NULL;
char x;
printf("请输入链表节点:\n");
L=creat();
print(L);
}
编写一个C语言程序 实现单链表的基本操作
# include stdio.h
# include malloc.h
# include stdlib.h
typedef struct Node
{
int data;
struct Node * pNext;
} * PNODE, NODE;
PNODE establish_list (void);
void traverse_list (PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead);
void insert_list(PNODE pHead, int pos, int val);
int delete_list(PNODE pHead, int pos, int val);
void freeer(PNODE pHead);
int main(void)
{
PNODE pHead;
int len, i, j, val;
pHead = establish_list();
traverse_list(pHead);
if(is_empty(pHead))
printf("链表为空\n");
else
printf("链表不空\n");
len = length_list(pHead);
printf("链表的长度为: %d\n", len);
sort_list(pHead);
traverse_list(pHead);
printf("请输入您要在第几个节点插入\n");
scanf("%d", i);
printf("请输入您要在第%d个节点插入的值\n", i);
scanf("%d", j);
insert_list(pHead, i, j);
traverse_list(pHead);
printf("请输入您要第几个删除的节点\n");
scanf("%d", i);
val = delete_list(pHead, i, val);
printf("您删除的节点值为: %d\n", val);
traverse_list(pHead);
freeer(pHead);
return 0;
}
PNODE establish_list(void)//初始化链表,返回头结点地址
{
int val, len;
PNODE Tem;
PNODE pNew;
PNODE pHead;
pHead = (PNODE)malloc(sizeof(NODE));
Tem = pHead;
if(NULL == pHead)
{
printf("分配失败");
exit(-1);
}
Tem-pNext = NULL;
printf("请输入您要定义节点的长度: ");
scanf("%d", len);
for (int i=0;ilen;++i)
{
printf("请输入第%d个节点的值: ", i+1);
scanf("%d", val);
pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("分配失败");
exit(-1);
}
pNew-data = val;//首先把本次创建的新节点的值付给新节点的数据域
Tem-pNext = pNew;//然后使用临时的节点变量的指针域保存了新节点的地址,也就是指向了新节点
pNew-pNext = NULL;//如何再不循环,新节点成为最后一个节点
Tem = pNew;//把本次分配的新节点完全的赋给Tem,Tem就成为了这次新节点的影子,那么下次分配新节点时可以使用上个新节点的数据
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead;//使用P是为了不改写头结点里保存的地址
p = pHead-pNext;//使P指向首节点
while(p != NULL)//P本来就是头结点的指针域,也就是首节点的地址,既然是地址就可以直接判断p是否等于NULL
{
printf("%d ", p-data);
p = p-pNext;//使P每循环一次就变成P的下一个节点
}
}
bool is_empty(PNODE pHead)
{
if(NULL == pHead-pNext)
return true;
else
return false;
}
int length_list(PNODE pHead)
{
PNODE p = pHead-pNext;
int len = 0;
while(p != NULL)
{
len++;
p = p-pNext;
}
return len;
}
void sort_list(PNODE pHead)
{
int i, j, t, len;
PNODE p, q;
len = length_list(pHead);
for(i=0,p=pHead-pNext;ilen;i++,p=p-pNext)//逗号后只是为了找到下一个节点,因为不是数组,所以不能使用下标来++
{
for(j=0,q=pHead-pNext;jlen;j++,q=q-pNext)
if(q-data p-data)//这里的大小与号可以决定是升序还是降序,如果是大于号就是升序,反之小于号就是降序
{
t = q-data;
q-data = p-data;
p-data = t;
}
}
return;
}
void insert_list(PNODE pHead, int pos, int val)
{
int i;
PNODE q = pHead;
PNODE p = pHead;
if(pos 0 pos = length_list(pHead))
{
for(i=0;ipos;i++)
{
q = q-pNext;//q就是要插入的连接点
}
for(i=1;ipos;i++)
{
p = p-pNext;//p就是要插入连接点的前一个节点
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
p-pNext = pNew;
pNew-data = val;
pNew-pNext = q;
}
else if(pos length_list(pHead))//追加
{
PNODE t;
t = pHead;
PNODE PN;
PN = (PNODE)malloc(sizeof(NODE));
if(PN == NULL)
printf("分配失败");
else
while(t-pNext != NULL)
{
t = t-pNext;//使T-pNext成为尾结点
}
PN-data = val;//给新节点赋予有效数据
t-pNext = PN;//使尾结点的指针域指向了新的结点
PN-pNext = NULL;//新节点成为尾结点
}
else
printf("error\n");
return;
}
int delete_list(PNODE pHead, int pos, int val)
{
int i, j;
PNODE q, p;
q = pHead;
p = pHead;
if(pos 0 pos = length_list(pHead))//保证删除的是节点的有效数
{
for(i=0;ipos;i++)
{
p = p-pNext;
}
for(j=1;jpos;j++)
{
if(pos == 0)
q = pHead;
else
q = q-pNext;
}
q-pNext = p-pNext;
val = p-data;
free(p);
return val;
}
else
printf("error");
}
void freeer(PNODE pHead)
{
PNODE pT = pHead;
while(NULL != pHead-pNext)
{
free(pT);
pT = pT-pNext;
}
return;
}
/*
好久以前写的一个链表了,有排序,插入,删除,输出,判断是否为空,甚至还有释放堆中内存的功能
*/