创建单链表的C程序

作者&投稿:禾昨 (若有异议请与网页底部的电邮联系)
帮我编写一个用C语言编写的单链表的建立,和输入输出操作,谢谢各位~

#include
#include

typedef struct node
{
int num;
struct node *next;
}lnode;

lnode *creat()
{
lnode *head,*p,*q;
int n;

head=NULL;

printf("输入要创建的节点数
");
scanf("%d",&n);
while(n)
{
p=(lnode *)malloc(sizeof(lnode));
printf("输入数据
");
scanf("%d",&p->num);
if (head==NULL)
{
head=q=p;
}
else
{
q->next=p;
q=p;
}
n--;
}
q->next=NULL;
return head;
}

lnode *insert(lnode *head)
{
lnode *p,*q,*s;
int n;
char ch;

q=p=head;

printf("输入插入的位置
");
scanf("%d",&n);
printf("请选择是插入在前还是在后(F or B)
");
getchar();
ch=getchar();
if(ch=='F'||ch=='f')
{
s=(lnode *)malloc(sizeof(lnode));
printf("请输入数据
");
scanf("%d",&s->num);
while(p&&--n)
{
q=p;
p=p->next;
}
if (q==p)
{
s->next=q;
return s;
}
else
{
q->next=s;
s->next=p;
return head;
}
}
else if (ch=='B'||ch=='b')
{
s=(lnode *)malloc(sizeof(lnode));
printf("请输入数据
");
scanf("%d",&s->num);
while(p&&n--)
{
q=p;
p=p->next;
}
if (NULL==q->next)
{
q->next=s;
s->next=NULL;
return head;
}
else
{
q->next=s;
s->next=p;
return head;
}
}
else
{
printf("输入错误
");
}

}
lnode *del(lnode *head)
{
lnode *p,*q;
int n;
int flag=0;

p=q=head;
printf("请输入删除的数据
");
scanf("%d",&n);
while(p)
{

if (p->num==n)
{
flag=1;
if (head==p)
{
head=head->next;

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

}
else
{
q->next=p->next;

}
}
q=p;
p=p->next;
}
if (flag==0)
{
printf("没有找到数据
");
system("pause");
}
else
{
printf("删除成功
");
system("pause");
}
return head;
}

lnode *sort(lnode *head)
{
lnode *t,*f,*min,*p_min,*s;
char ch;


f=NULL;

printf("请输入排序方式:升序(A/a),降序(D/d)
");
getchar();
ch=getchar();
if (ch=='A'||ch=='a')
{
while(NULL!=head)
{
for (min=head,s=head;s->next!=NULL;s=s->next)
{
if (min->num>s->next->num)
{
p_min=s;
min=s->next;

}
}
if (NULL==f)
{
f=min;
t=min;
}
else
{
t->next=min;
t=min;
}
if (min==head)
{
head=head->next;
}
else
{
p_min->next=min->next;
}
}
if (f!=NULL)
{
t->next=NULL;
}
printf("排序完成
");
system("pause");
head=f;
return f;
}
else if (ch=='D'||ch=='d')
{
while(NULL!=head)
{
for (min=head,s=head;s->next!=NULL;s=s->next)
{
if (min->numnext->num)
{
p_min=s;
min=s->next;

}
}
if (NULL==f)
{
f=min;
t=min;
}
else
{
t->next=min;
t=min;
}
if (min==head)
{
head=head->next;
}
else
{
p_min->next=min->next;
}
}
if (f!=NULL)
{
t->next=NULL;

}
printf("排序完成
");
system("pause");
head=f;
return f;

}
}

void dispaly(lnode *head)
{
lnode *p;

p=head;

printf("
");
while(p!=NULL)
{
printf("%d",p->num);
p=p->next;
}
}

int getoption()
{
int n;

printf("0 退出
");
printf("1 创建链表
");
printf("2 插入节点
");
printf("3 删除节点
");
printf("4 排序节点
");
printf("5 显示链表
");
printf("请选择操作");
scanf("%d",&n);
return n;
}

int main()
{
lnode *temp;
char ch;
int o;

do
{
system("cls");
o=getoption();
switch (o)
{
case 0:
exit(0);
break;
case 1 :
system("cls");
temp=creat();
break;
case 2:
system("cls");
temp=insert(temp);
break;
case 3:
system("cls");
temp=del(temp);
break;
case 4:
system("cls");
temp=sort(temp);
break;
case 5:
system("cls");
dispaly(temp);
system("pause");
break;

}
system("cls");
printf("按0退出,任意键继续");
ch=getchar();
if (ch=='0')
{
exit(0);
}
} while (ch!='0');
}

给你个例子吧

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
struct Node{
int data;
struct Node * next;
};
/*创建链表*/
Node * Create()
{
int n=-1;
Node *head,*p1,*p2;
p1=new Node;
printf("请输入数据");
scanf("%d",&p1->data);
head=NULL;
while(p1->data!=-1)
{
if(n==-1)
{
head=p1;
}
else
p2->next=p1;
p2=p1;
p1=new Node;
scanf("%d",&p1->data);
n++;
}
p2->next=NULL;
return head;
}
/*显示链表*/
void Show(Node * head)
{
Node *p1;
p1=head;
while(p1!=NULL)
{
printf("%d
",p1->data);
p1=p1->next;
}
}
/*删除链表中元素*/
int del(Node *head,int p)
{
Node * tmp=head;
for(int i=0;i<p;i++)
{
if(tmp==NULL)
return -1;
if(i<p-1)
tmp=tmp->next;
}
int ret=tmp->next->data;
tmp->next=tmp->next->next;
return ret;

}
/*插入链表元素*/
void insert(Node * head,int p,int x)
{
Node * tmp=head;
for(int i=0;i<p;i++)
{
if(tmp==NULL)
return ;
if(i<p-1)
tmp=tmp->next;
}
Node *tmp2=new Node;
tmp2->data=x;
tmp2->next=tmp->next;
tmp->next=tmp2;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node *p;int locnum,data;
char choicenum;
while(true)
{
printf("*****************学生信息管理系统*****************
");
printf("a.创建学生链表
");
printf("b.插入学生信息
");
printf("c.删除学生信息
");
printf("d.显示学生信息
");
printf("e.退出
");
printf("**************************************************
");
printf("请输入您选择的功能代号
");
scanf("%c",&choicenum);
if(choicenum=='a')
{
p=Create();
}
else if(choicenum=='b')
{
printf("请输入要插入数据的位置
");
scanf("%d",&locnum);
printf("请输入插入的数据");
scanf("%d",&data);
insert(p,locnum,data);
}
else if(choicenum=='c')
{
printf("请输入要删除数据的位置
");
scanf("%d",&locnum);
del(p,locnum);
}
else if(choicenum=='d')
{
printf("学生信息:");
Show(p);
}
else if(choicenum=='e')
{
break;
}
else
{
printf("请输入正确的序号
");
}

}
return 0;
}

问题出在:s* create_list()这个函数

我们来分析下:

p=(s *)malloc(sizeof(s));//申请一个新的空间

p->i=a[j];//为该空间的数据单元赋值

j--;//循环条件变量

p->next=h->next;//意味着p的下一个空间与头指针h一致

h->next=p;//h的下一个元素为p这个新空间

好了,现在我们分析最后这两句:(倒数第二句我们称为句A,最后一句称句B)

1、h为定址:h指针指向的空间始终不变这个比较好理解,因为AB句对h的操作只操作它的next。那好,现在我们令h的地址为0x00.

2、如图:看看程序运行的流程。

所以另一种改法是:去掉p->next = '\0‘就可以了,不然的话,就前功尽弃了。当然,最后还是要加上free(p).

此时输出的是:12345

改后的程序如下:

s* create_list()

{

int a[]={1,2,3,4,5},j=4;

s *h,*p;

h=(s *)malloc(sizeof(s));

h->next='\0';

while(j>=0)

{

p=(s *)malloc(sizeof(s));

p->i=a[j];j--;p->next=h->next;h->next=p;

}

/*p->next='\0';*/

free(p);

return h;

}

<<<<<最后,十分感谢你,让我琢磨出了双指针建单链表的方法。我第一次给你的方法要用三指针



h->next='\0';
p->next='\0';
改成:
p->next=NULL;
h->next=NULL;

while(p!='\0')
改成:
while(p)
注意:'\0'是一个字符,不能用判断指针是不是空。

这段也有问题:
h=(s *)malloc(sizeof(s)); //首结点没有赋值
h->next='\0';
while(j>=0)
{
p=(s *)malloc(sizeof(s));
p->i=a[j];j--;p->next=h->next;h->next=p; //这里只是从第二个结点开始赋值了
}

用C语言头插法或尾插法建立带头结点的单链表,实现单链表上的插入,删除...
答:LinkList p; /* 声明一结点p */ p = L->next; /* 让p指向链表L的第一个结点 */ j = 1; /* j为计数器 */ while (p && jnext; /* 让p指向下一个结点 */ ++j;} if ( !p || j>i )

用c语言编写,实现单链表的建立(数据元素为1,2,3,4,5,6),遍历,查找,插 ...
答:纯手工,自己调试的,望楼主加分,不懂可追问 include <stdio.h> include <malloc.h> typedef struct List { int data;List* next;}List;List* Init(int n){ List *p, *q, *head;int i = 0;q = (List*)malloc(sizeof(List));p = (List*)malloc(sizeof(List));head = (List*)...

谁能给我个C语言最简单的单链表例子。只要有创建和输出就足够了 要动...
答://链表建立 Node* creat(){ Node *head = NULL, *p = NULL, *s = NULL;int Date = 0, cycle = 1;head = (Node*)malloc(sizeof(Node));if(NULL == head){ printf("分配内存失败\r\n");return NULL;} head->pstnext = NULL;p = head;while(cycle){ printf("请输入数据且当...

逆序输入n个数据元素的值,建立带头结点的单链表的c语言程序?急需!!!
答://---线性表的单链表存储结构--- typedef struct LNode{ ElemType data;struct LNode *next;}LNode, *LinkList;void CreateList_L(LinkList &L,int n){ //逆位序输入n个元素的值,建立带表头结点的单链线性表L。L = (LinkList)malloc(sizeof(LNode));L->next = NULL; //先建立一...

建立单链表 用C语言方式
答:首先,你真的确定你知道什么是链表,什么是顺序表?好了,算了就按题中的顺序表来写喽(不过,我真的建议你,如果你真不清楚,请把它弄清楚,ok?)程序代码:(看上去有点多,其实算法很简单的)#include<stdlib.h> include<stdio.h> include<conio.h>#define LIST_INT_SIZE 1000 define ERROR ...

C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置_百度知 ...
答:/ 时间:2010年8月28日17:19:49 功能:C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置 / include"stdio.h"include"stdlib.h"include"malloc.h"/*假设输入的数据为3个--我比较好操作-_-*/ define size 3 typedef struct List { int num;int shuju;struct List *next;}list;/...

一个c语言的程序题?
答:然后,在main()函数中定义一个头节点指针,并用它来存储整个链表 请点击输入图片描述 接下来,实现从键盘输入五个整数并将它们尾插入链表中 请点击输入图片描述 最后,实现链表中的插入和删除操作,并输出链表中的所有元素 下面是一个可行的c语言程序,该程序实现了从键盘输入五个整数并存储在链表中,...

数据结构代码(用C语言) 单链表的插入和删除
答://链表建立 Node* creat(){ Node *head = NULL, *p = NULL, *s = NULL;int Date = 0, cycle = 1;head = (Node*)malloc(sizeof(Node));if(NULL == head){ printf("分配内存失败\r\n");return NULL;} head->pstnext = NULL;p = head;while(cycle){ printf("请输入数据且当...

C语言求解单链表的建立
答:else tail=tail->next=p; } return head; } struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的节点,int b代表创建节点的数据域 { struct chain *p,*q,*s; s = (struct chain *)malloc(sizeof(struct chain)); s->value=b; if(head==NULL) { head = ...

编写一个C语言程序 实现单链表的基本操作
答: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"...