 2016-10-29 12:51

# 单链表的基本操作 c语言

• 点赞
• 写回答
• 关注问题
• 收藏
• 复制链接分享
• 邀请回答

#### 3条回答

• typedef struct node
{
int n;
struct node next;
}Node;
Node *create();
void print(Node *head);
Node *sort(Node *head);
Node *swap(Node *head);
void main()
{
Node *head = create();
print(head);
// head = sort(head);
// print(head);
//head = swap(head);
//print(head);
}
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
}
free(p1);
p1 = NULL;
return head;
}
void print(Node *head)
{
Node *p = head;
while(p != NULL)
{
printf("%d ",p->n);
p = p->next;
}
printf("\n");
}
Node *sort(Node *head)
{
Node *newhead=NULL,*newtail=NULL,*p,*min,*minf;
if(head == NULL || head->next == NULL)
return head;
while(head != NULL)
{
p = min = head;
for(;p->next != NULL;p = p->next)
{
if(p->next->n < min->n)
{
min = p->next;
minf = p;
}
}
//2
if(newhead==NULL)
{
newhead = newtail = min;
}
else
{
newtail->next = min;
newtail = min;
}
//3
if(min == head)
head = head->next;
else
minf->next = min->next;
}
if(newhead != NULL)
newtail->next = NULL;
return newhead;
}
Node *swap(Node *head)
{
Node *p = NULL,*pf = NULL,*pn = NULL;
if(head == NULL || head->next == NULL)
return head;
pf = head;
p = pf->next;
pf->next = NULL;
while(p->next != NULL)
{
pn = p->next;
p->next = pf;
pf = p;
p = pn;
}
p->next = pf;
head = p;
return head;
}

void test(Node *head)
{
Node *p1,*p2;
p1 = p2 = head;
while(p1 != NULL)
{
p1 = p1->next;
if(p1!=NULL)
{
p1 = p1->next;
p2 = p2->next;
}
}
}

#endif

typedef struct data
{
int n;
struct data next;
struct data *front;
}Node;
#if 0
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
}
free(p1);
p1 = NULL;
p2->next = head;
return head;
}
void print(Node *head)
{
Node *p = head;
do
{
printf("%d ",p->n);
p = p->next;
}while(p != head);
printf("\n");
}
#endif

Node create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node
)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
{
p2->next = p1;
p1->front = p2;
}
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
}
free(p1);
p1 = NULL;
return head;
}
void print(Node *head)
{
Node *p = head,*p1 = NULL;
while(p != NULL)
{
p1= p;
printf("%d ",p->n);
p = p->next;
}
printf("\n");
while(p1 != NULL)
{
printf("%d ",p1->n);
p1 = p1->front;
}
printf("\n");
}
int main()
{
Node *head = create();
print(head);
return 0;
}
看不懂的话可以私我

点赞 评论 复制链接分享
• #include
#include
//结构体
struct Node{

int data;

struct Node* next;
};
//创建链表
struct Node* createList(){
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); //headnode变成了结构体变量
headNode->next = NULL;
return headNode;
}
// 创建结点

struct Node* createNode(int data){
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next=NULL;
return newNode;

}
//打印
void printList(struct Node* headNode) {
struct Node* pMove=headNode->next;
while(pMove){
printf("%d",pMove->data);
pMove = pMove->next;
}
printf("\n");
}
//头部插入 插入结点 参数；插入那个结点，插入结点的数据是多少
void insertNodeByHead(struct Node* headNode,int data){
//创建插入的结点
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
} //删除结点
void deleteNodeByAppoin(struct Node* headNode,int posData){
struct Node* posNode=headNode->next;
struct Node* posNodeFront = headNode;
if(posNode==NULL) //posNode指定位置
printf("链表为空\n"); //posNodeFront 指定位置前面

else{

`````` while(posNode->data!=posData){
posNodeFront=posNode;
posNode=posNodeFront->next;
if(posNode==NULL){
printf("没找到相关信息\n");
return;
}
``````

}
posNodeFront->next = posNode->next;
free(posNode);
}
}

int main(){
struct Node* list = createList();
insertNodeByHead(list,1);
insertNodeByHead(list,2);
insertNodeByHead(list,3);
printList(list);
deleteNodeByAppoin(list,2);
printList(list);
system("pause");
return 0;
}

点赞 评论 复制链接分享
• 　1、查找

对单链表进行查找的思路为：对单链表的结点依次扫描，检测其数据域是否是我们所要查好的值，若是返回该结点的指针，否则返回null

因为在单链表的链域中包含了后继结点的存储地址，所以当我们实现的时候，只要知道该单链表的头指针，即可依次对每个结点的数据域进行检测

以下是应用查找算法的一个例子：

#include ＜stdio.h＞
#include ＜malloc.h＞
#include ＜string.h＞ /*包含一些字符串处理函数的头文件*/
#define n 10
typedef struct node
{
char name;
struct node *link;
}stud;

stud * creat(int n) /*建立链表的函数*/
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==null)
{
printf(\"不能分配内存空间!\");
exit(0);
}
h-＞name=\'\0\';
h-＞link=null;
p=h;
for(i=0;i＜n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==null)
{
printf(\"不能分配内存空间!\");
exit(0);
}
p-＞link=s;
printf(\"请输入第%d个人的姓名\",i+1);
scanf(\"%s\",s-＞name);
s-＞link=null;
p=s;
}
return(h);
}

stud * search(stud h,char *x) /查找链表的函数，其中h指针是链表的表头指针，x指针是要查找的人的姓名*/
{
stud p; /当前指针，指向要与所查找的姓名比较的结点*/
char y; /保存结点数据域内姓名的指针*/
p=h-＞link;
while(p!=null)
{
y=p-＞name;
if(strcmp(y,x)==0) /*把数据域里的姓名与所要查找的姓名比较，若相同则返回0，即条件成立*/
return(p); /*返回与所要查找结点的地址*/
else p=p-＞link;
}
if(p==null)
printf(\"没有查找到该数据!\");
}

main()
{
int number;
char fullname;
stud head,*searchpoint; /*head是表头指针，searchpoint是保存符合条件的结点地址的指针/
number=n;
head=creat(number);
printf(\"请输入你要查找的人的姓名:\");
scanf(\"%s\",fullname);
searchpoint=search(head,fullname); /*调用查找函数，并把结果赋给searchpoint指针*/
}

点赞 评论 复制链接分享